我观察到有关定期JobScheduler的一个问题。只要不强制关闭应用程序,它就会按预期工作。在这种情况下,不管方法Schedule()仅被调用一次,都将触发JobScheduler三次。就我而言,JobScheduler在调用OnStop()方法时启动,而在调用OnStart()方法时停止。这意味着只要应用程序在后台运行,JobScheduler都可以工作。
JobScheduler内部的简化代码:
public override bool OnStartJob(JobParameters @params)
{
CancellationToken token = tokenSource.Token;
bleTask = Task.Run(async() =>
{
await ScanForDevice(@params, token);
},token);
return true;
}
public override bool OnStopJob(JobParameters @params)
{
if(bleTask != null)
{
if (bleTask.Status == TaskStatus.WaitingForActivation)
tokenSource.Cancel();
}
return false;
}
public async Task ScanForDevice(JobParameters jobParams, CancellationToken token)
{
for (int i = 0; i < 120; i++)
{
if (token.IsCancellationRequested)
{
return;
}
await Task.Delay(500); // piece of code is simulated with some delay
}
JobFinished(jobParams, false);
}
我真的不明白为什么在强制关闭应用程序的情况下JobScheduler会被执行三次。如果OnStartJob()返回值为false,则很可能会引起上述问题,这很有趣。
答案 0 :(得分:0)
如果您的OnStopJob()
方法返回true
,则对Android意味着:重新安排作业。作为参考,请参见documentation。
true表示是否要重新安排JobManager的时间 基于作业创建时提供的重试标准的作业;要么 错误以完全结束工作。无论返回的价值如何, 作业必须停止执行。
据我所知,通过返回false
已经解决了问题,这是正确的方法。如果应用程序强制终止,则该作业不应运行。