Firebase Jobdispatcher:由于错误而无休止运行的作业永远不会再次安排

Posted

技术标签:

【中文标题】Firebase Jobdispatcher:由于错误而无休止运行的作业永远不会再次安排【英文标题】:Firebase Jobdispatcher: Jobs that run endlessly due to an error are never scheduled again 【发布时间】:2018-02-24 13:07:01 【问题描述】:

对于因崩溃或 android 进程清理而未完成的重复作业会怎样? 在我看来,不可能重新安排它。它永远不会再次执行。

示例

public class MyJobService extends JobService 


    @Override
    public boolean onStartJob(JobParameters job) 
    
        doSomeWork(job);

        return true; // true = there is still work going on!
    

    private void doSomeWork(final JobParameters job) 

        new Thread() 

            public void run() 
            
                // do some work, maybe load data from internet
                // loading...
                // loading...
                // app crashes or its process is killed by Android
                
                // this piece of code is never reached!
                jobFinished(job, false);
            
            
        .start();
    
    
    

正如您在代码中看到的,作业永远不会因崩溃而终止。之后不会重新安排。

如果你想用FirebaseJobDispatcher.mustSchedule() 重新安排它,它会出现在 logcat 中:

E/FJD。 ExternalReceiver:接收到已经在运行的作业的执行请求

W/FJD。 JobService: 标签 = ... 的作业已经在运行

即使你之前运行过FirebaseJobDispatcher.cancel()

有什么建议吗?

【问题讨论】:

如果发生崩溃,您可以在 catch/finally 块中调用 jobFinished。您也可以尝试 getAllPendingJobs(),找到您的工作并在安排新工作之前取消它。 不幸的是,“FirebaseJobDispatcher.getAllPendingJobs()”没有实现。我的意思不是可以捕获的异常。如果 Android 关闭应用程序会发生什么,例如。 G。如果内存不足?。 【参考方案1】:

将您的代码放入 try catch 块中。在 catch 块调用中 工作完成(工作,真); . "true" 表示作业将被重新安排。

“如果 Android 关闭应用程序会发生什么,例如在内存不足的情况下?” .在这种情况下,os 将引发 OutOfMemory 错误,您的 try catch 块将处理它。

【讨论】:

如果你能把代码更好地改善答案可能会更好 再次:如果没有可以捕获的“正常”异常会发生什么?如果 Android 在没有引发可捕获异常的情况下关闭应用会发生什么? 试试这个 onStopJob 将在 os 取消作业时被调用,返回 true 将重新安排您的作业@Override public boolean onStopJob(JobParameters job) return true; 你确定,onStopJob 总是被调用吗?它不被称为例如当设备没电了!? 电池状态应该由你处理。

以上是关于Firebase Jobdispatcher:由于错误而无休止运行的作业永远不会再次安排的主要内容,如果未能解决你的问题,请参考以下文章

Firebase Jobdispatcher - 现在开始并重复

Firebase jobdispatcher 未在指定窗口内触发

为啥 Firebase JobDispatcher 运行 JobService 2 次?

在 Firebase JobDispatcher 中更改定期任务的周期?

在firebase jobdispatcher中停止JobService内的计划作业

如何在 Firebase JobDispatcher 中设置周期性任务的周期?