当JobService
完成并且我们在后台线程中工作时,我们调用jobFinished
让系统知道我们的工作已经结束,它可以释放唤醒锁。
jobFinished
采用布尔值needsReschedule
作为第二个参数,当我们传递true时,它会根据退避标准重新安排。但是如果我们想要定期工作,我们会在setPeriodic
对象上使用JobInfo
。另一方面,我们不会为取消的作业调用jobFinished
,而onStopJob
的返回值已经定义了我们是否要重新安排作业。
那么什么时候将true
needsReschedule
传递给已完成的工作是有意义的呢?
示例:
public class ExampleJobService extends JobService {
private static final String TAG = ExampleJobService.class.getSimpleName();
boolean jobCancelled = false;
@Override
public boolean onStartJob(JobParameters params) {
Log.d(TAG, "Job started");
doBackgroundWork(params);
return true;
}
private void doBackgroundWork(final JobParameters params) {
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
Log.d(TAG, "Running: " + i);
if (jobCancelled) {
return;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Log.d(TAG, "Job finished");
jobFinished(params, false);
}
}).start();
}
@Override
public boolean onStopJob(JobParameters params) {
Log.d(TAG, "Job cancelled before completion");
jobCancelled = true;
return true;
}
}
public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void scheduleJob(View v) {
ComponentName componentName = new ComponentName(this, ExampleJobService.class);
JobInfo info = new JobInfo.Builder(1, componentName)
.setRequiresCharging(true)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.setPersisted(true)
.setPeriodic(15 * 60 * 1000)
.build();
JobScheduler scheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
int resultCode = scheduler.schedule(info);
if (resultCode == JobScheduler.RESULT_SUCCESS) {
Log.d(TAG, "Job scheduled");
} else {
Log.d(TAG, "Job scheduling failed");
}
}
public void cancelJob(View v) {
JobScheduler scheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
scheduler.cancel(1);
Log.d(TAG, "Job canceled");
}
}
答案 0 :(得分:1)
尽管文档似乎没有指定它,因为needsReschedule
与作业的退避标准有关,但我将其视为重试机制。
在后台工作失败的情况下(例如,可能是由于HTTP请求失败),您可能想在下一次预期的作业执行之前重试。那就是您为true
的{{1}}传递jobFinished
的时候。