JobScheduler 在应用被强行关闭时执行了 3 次
JobScheduler is executed three times when the application is force closed
我观察到一个关于周期性 JobScheduler 的问题。只要应用程序没有被强制关闭,它就会按预期工作。在这种情况下,JobScheduler 被触发了三次,而不管 Schedule() 方法只被调用了一次这一事实。在我的例子中,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执行了3次。非常有趣的是,如果 OnStartJob() return 值为 false,则上述问题无法重现。
如果您的 OnStopJob()
方法 returns true
意味着 Android:重新安排作业。有关参考,请参阅 documentation.
true to indicate to the JobManager whether you'd like to reschedule
this job based on the retry criteria provided at job creation-time; or
false to end the job entirely. Regardless of the value returned, your
job must stop executing.
据我所知,您已经通过返回 false
解决了问题,这是正确的做法。如果应用程序被强制终止,则作业不应为 运行.
我观察到一个关于周期性 JobScheduler 的问题。只要应用程序没有被强制关闭,它就会按预期工作。在这种情况下,JobScheduler 被触发了三次,而不管 Schedule() 方法只被调用了一次这一事实。在我的例子中,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执行了3次。非常有趣的是,如果 OnStartJob() return 值为 false,则上述问题无法重现。
如果您的 OnStopJob()
方法 returns true
意味着 Android:重新安排作业。有关参考,请参阅 documentation.
true to indicate to the JobManager whether you'd like to reschedule this job based on the retry criteria provided at job creation-time; or false to end the job entirely. Regardless of the value returned, your job must stop executing.
据我所知,您已经通过返回 false
解决了问题,这是正确的做法。如果应用程序被强制终止,则作业不应为 运行.