什么时候在jobService的jobFinished方法中为needsReschedule传递true是有意义的

时间:2018-03-25 18:40:20

标签: android job-scheduling android-jobscheduler

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");
}
}

1 个答案:

答案 0 :(得分:1)

尽管文档似乎没有指定它,因为needsReschedule与作业的退避标准有关,但我将其视为重试机制。

在后台工作失败的情况下(例如,可能是由于HTTP请求失败),您可能想在下一次预期的作业执行之前重试。那就是您为true的{​​{1}}传递jobFinished的时候。