1

我正在尝试测试使用 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 连接并关闭了屏幕。我把它留了一夜,然后来检查我的服务器数据库上的记录以获取结果。

  1. 设备以几乎相同的速率持续发送服务器网络数据,每分钟至少两次,持续了 10 个小时!(这不是预期的,因为设备应该进入打盹,对吧?)
  2. 之后就没有再发送请求了!从凌晨 3 点到上午 9 点 30 分,我没有收到任何东西发送到服务器。我打开我的设备屏幕,将其连接到电源,打开应用程序......等了一个小时,仍然没有发送更多内容。为什么?服务刚刚被杀死了吗?我该如何解决这样的问题?

注意

当然,我不打算在真正的应用程序上做如此繁重的重复工作。但是,我只是在做一个测试应用程序来了解 JobScheduler 和 JobService 的行为。又为什么突然就白死了,再也没有开始了?!

4

0 回答 0