我在新的Android API 21中遇到JobScheduler的作业计划问题。 这是我用60秒间隔安排工作的代码,如下所示:
ComponentName serviceName = new ComponentName(this, MyJobService.class);
JobInfo jobInfo = new JobInfo.Builder(0, serviceName)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.setPeriodic(60000)
.build();
我的JobService只在Logcat中打印运行时,但是日志显示服务在这个时刻运行:
03-18 08:37:26.334: I/JOB(32662): Wed Mar 18 08:37:26 BRT 2015
03-18 08:37:56.364: I/JOB(32662): Wed Mar 18 08:37:56 BRT 2015
03-18 08:39:21.418: I/JOB(32662): Wed Mar 18 08:39:21 BRT 2015
03-18 08:41:51.670: I/JOB(32662): Wed Mar 18 08:41:51 BRT 2015
03-18 08:45:52.192: I/JOB(32662): Wed Mar 18 08:45:52 BRT 2015
03-18 08:54:20.678: I/JOB(32662): Wed Mar 18 08:54:20 BRT 2015
这很奇怪,因为在我使用setPeriodic(60000)方法设置时,它应该在1分钟内执行至少1次。 同样好奇的是如何在运行之间增加间隔。此时的时间是2015年3月18日星期三09:09:00 BRT 2015并且工作不会被执行更多。
JobScheduler API存在问题吗? (我在使用Android 5.0.1的Nexus 5中运行)
答案 0 :(得分:9)
时间的变化与重试作业的退避标准有关。默认情况下,它设置为指数。我猜你通过拨打jobFinished(JobParameters params, boolean needsReschedule)
完成工作后也未正确完成工作。
我写了一个blog post,专注于JobScheduler的所有小事情。我强烈建议你阅读它。
答案 1 :(得分:5)
答案 2 :(得分:1)
//下面是我在我的项目中使用的代码,它对我来说很好。
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public void scheduleJob(Context context) {
//https://kb.sos-berlin.com/pages/viewpage.action?pageId=3638048
//Scheduler uses UTC times for all its internal operations. This ensures a continual flow of operation without breaks or repetitions regardless of any changes in local time.
JobInfo.Builder builder = new JobInfo.Builder(JOB_ID, new ComponentName(context, MyService.class));//JobSchedulerService.class.getName()));
builder.setPersisted(true); //persist across device reboots
builder.setPeriodic((120 * 60 * 1000)); //run once after 2 hours seconds
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY); // only if wifi avaiblable so they are not using bandwith
builder.setRequiresDeviceIdle(false); // run not only if the device is idle
builder.setRequiresCharging(false); // run not only if the device is charging
// android.os.PersistableBundle bundle = new android.os.PersistableBundle();
// bundle.putString(WEB_SERVICE_URL, "http://example.com?upload.php");
// builder.setExtras(bundle);
//builder.setBackoffCriteria(1600, JobInfo.BACKOFF_POLICY_LINEAR);
//BACKOFF_POLICY_LINEAR After one failure retry at 1 * your value, then at 2 * (your value), then 3 * (your value) and so on
//BACKOFF_POLICY_EXPONENTIAL After one failure retry at your value, then at (your value)^2, (your value)^3 and so on
//builder.setMinimumLatency(5 * 1000); //latency
//builder.setOverrideDeadline(50 * 1000); //wait for criteria to be met, in 50 seconds if they have not then run anyways
int test = jobScheduler.schedule(builder.build());
if (test <= 0) {
Utility.showDialog(context, "Service Error", "Service is not responding");
//If something goes wrong
}
}
我们按照以下指示定义了服务类:
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public class MyService extends JobService {
@Override
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public boolean onStartJob(final JobParameters params) {
Log.e(TAG, "onStartJob");
String month = "3";
String year = "2018";
MyAsync myAsync = new MyAsync(MyService.this, arraydata, month, year, new SyncAsyncListener() {
@Override
public void onDataSuccess() {
try {
jobFinished(params, result);
} catch (Exception e) {
}
}
});
myAsync.execute();
}
return result;
}
@Override
public boolean onStopJob(JobParameters jobParameters) {
return false;
}
}