android-GcmTaskService可以运行异步任务吗?

android-GcmTaskService可以运行异步任务吗?,第1张

概述我需要在Android应用程序的后台定期运行网络任务.我最初打算使用AlarmManager(无法使用JobScheduler,因为它必须能在棒棒糖之前的设备上运行),但是后来我遇到了GcmNetworkManager,它看起来更易于使用,并且提供了更简单的API,并且可以解决如果设备已连接到Internet,则可以运行任务(

我需要在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可以运行异步任务吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1090331.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存