我正在尝试测试使用 JobScheduler 在 Android API 23 上安排后台任务的可靠性,因为我注意到有时它会出现异常并停止工作。
这就是我在 SystemManager.java 类中安排作业的方式:
public static void scheduleUploadJob(Context context) {
ComponentName componentName = new ComponentName(context, BackgroundUploadJobScheduler.class);
JobInfo info = new JobInfo.Builder(123, componentName)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.setPersisted(true)
.setPeriodic(120*60*1000)
.build();
JobScheduler scheduler = (JobScheduler) context.getSystemService(JOB_SCHEDULER_SERVICE);
int resultCode = scheduler.schedule(info);
if (resultCode == JobScheduler.RESULT_SUCCESS) {
Log.d("ScheduleJob()", "Job scheduled successfully!");
} else {
Log.d("ScheduleJob()", "Job scheduled Failed!");
}
}
public class BackgroundUploadJobScheduler extends JobService {
private static final String TAG = "JobSevice";
public static boolean jobCancelled = false;
@Override
public boolean onStartJob(JobParameters params) {
Log.d(TAG, "Events upload Job started");
doBackgroundUploading(params, this);
return true;
}
@Override
public boolean onStopJob(JobParameters params) {
Log.d(TAG, "upload Job cancelled before completion");
jobCancelled = true;
return true;
}
public synchronized void doBackgroundUploading(final JobParameters params, final Context context) {
new Thread(new Runnable() {
@Override
public void run() {
if (jobCancelled) {
return;
}
UploadObject uploadObject= //get it from RoomDB
NetworkManager.upload(context,uploadObject);
}
jobFinished(params, false);
}
}).start();
}
我使用 Retrofit 在 NetworkManager.java 类中进行网络调用:
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
if (response.isSuccessful()) {
SystemManager.scheduleEventRecordUploadJob(context);
}else{
SystemManager.scheduleEventRecordUploadJob(context);
}
}
@Override
public void onFailure(Call call, Throwable t) {
SystemManager.scheduleEventRecordUploadJob(context);
}
});
问题
在我初始化应用程序并进行第一次网络调用后,我退出了应用程序,断开了 USB 连接并关闭了屏幕。我把它留了一夜,然后来检查我的服务器数据库上的记录以获取结果。
- 设备以几乎相同的速率持续发送服务器网络数据,每分钟至少两次,持续了 10 个小时!(这不是预期的,因为设备应该进入打盹,对吧?)
- 之后就没有再发送请求了!从凌晨 3 点到上午 9 点 30 分,我没有收到任何东西发送到服务器。我打开我的设备屏幕,将其连接到电源,打开应用程序......等了一个小时,仍然没有发送更多内容。为什么?服务刚刚被杀死了吗?我该如何解决这样的问题?
注意
当然,我不打算在真正的应用程序上做如此繁重的重复工作。但是,我只是在做一个测试应用程序来了解 JobScheduler 和 JobService 的行为。又为什么突然就白死了,再也没有开始了?!