我需要在Android应用程序的后台定期运行网络任务.
我最初打算使用AlarmManager(无法使用JobScheduler,因为它必须能在棒棒糖之前的设备上运行),但是后来我遇到了GcmNetworkManager,它看起来更易于使用,并且提供了更简单的API,并且可以解决如果设备已连接到Internet,则可以运行任务(也不需要与广播接收器一起使用,因此维护的类更少).
我遇到的问题是我需要运行的任务由3个异步步骤组成,并且似乎已创建GcmTaskService来运行同步任务.
我对此进行了测试,发现我的异步任务在GcmTaskService内运行到最后(我的服务随后会自行停止),但是我担心这可能是一个巧合,因为我的异步任务非常快,而不是该服务并未在GcmTaskService代码内停止的事实(我尝试查看该代码,但由于混淆了该代码,因此很难理解它的作用).
有谁知道GcmTaskService实际上是否在扩展类停止运行之前运行,还是在同步任务结束时停止运行?
解决方法:
经过一些调查和调试,我找到了答案.我将在这里进行描述,以便将来可以对其他人有所帮助.
正如我所怀疑的那样,当GcmTaskService需要运行的所有任务都完成时,它会自行停止(这很有意义).对此方法的证明(在GcmTaskService类内部):
private voID zzdJ(String var1) { Set var2 = this.zzaIU; synchronized(this.zzaIU) { this.zzaIU.remove(var1); if(this.zzaIU.size() == 0) { this.stopSelf(this.zzaIV); } }}
该方法在完成任务后(也就是onRunTask()返回之后)从运行任务的线程中调用.
var1是开发人员在创建任务时分配给该任务的标签,而zzaIU是该服务需要运行的任务列表.因此,如我们所见,已完成的任务将从列表中删除,并且如果没有更多的任务需要运行,则停止该服务.
可能的解决方案:
但是,有一种可能的解决方案可以在GcmTaskService中运行异步任务.为此,我们需要重写onStartCommand()方法,以防止GcmTaskService在另一个线程中启动任务.
该代码将如下所示:
private boolean taskRunning = false;@OverrIDepublic int onStartCommand(Intent intent, int flags, int startID) { String intentAction = intent.getAction(); if (SERVICE_ACTION_EXECUTE_TASK.equals(intentAction)) { taskRunning = true; // Run your async tasks. Make sure to stop the service when they end. } else if (SERVICE_ACTION_INITIAliZE.equals(intentAction)) { // Initialize tasks if needed (most likely not needed if they are running asynchronously) // If this step is not needed, make sure to stop the service if the tasks already run (this Could be called after // the service run all the tasks, and if we don't stop the service it'll stay running on the background without doing // anything) if (!taskRunning) { stopSelf(); } } return START_NOT_STICKY;}@OverrIDepublic int onRunTask(TaskParams taskParams) { // important: This method will not be run, since we have overrIDden the onStartCommand() to handle the tasks run ourselves, // which was needed because our tasks are asynchronous return GcmNetworkManager.RESulT_SUCCESS;}
仅当该服务开发为运行1个任务时才有效,如果需要运行多个任务,则需要使用列表而不是taskRunning布尔值,并检查大小以查看是否需要运行更多任务停止服务(就像原始的GcmTaskService代码一样).
即使这是一个解决方案,也不是将来的证明,因为GcmTaskService上的代码可能会在将来的Google Play服务版本上发生根本性的变化,在这种情况下,它可能会破坏此功能(不太可能,但可能).因此,为了安全起见,我认为我将只使用AlarmManager.
总结以上是内存溢出为你收集整理的android-GcmTaskService可以运行异步任务吗?全部内容,希望文章能够帮你解决android-GcmTaskService可以运行异步任务吗?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)