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 中更改定期任务的周期?