【问题标题】:Job Scheduler Not starting instantly on Android Lollipop(5.1.1)作业计划程序在 Android Lollipop (5.1.1) 上无法立即启动
【发布时间】:2016-12-16 11:43:49
【问题描述】:

我一直在使用 Job Scheduler API。对于棉花糖来说,它非常有效。 但是对于 Lollipop Device(5.1.1),它不会立即启动(需要随机数分钟)。我的意思是 onStartJob() 方法需要一些时间来调用。

以下是我用来安排我的工作的代码 sn-p。

private void scheduleJob() {
    ComponentName serviceName = new ComponentName(this, SampleJobService.class);
    JobInfo jobInfo = new JobInfo.Builder(1000, serviceName)
        .setRequiredNetworkType(JobInfo.NETWORK_TYPE_NONE)
        .setRequiresCharging(false)
        .setPeriodic(60 * 1000)
        .build();

    JobScheduler scheduler = (JobScheduler) this.getSystemService(Context.JOB_SCHEDULER_SERVICE);
    int result = scheduler.schedule(jobInfo);
    if (result == JobScheduler.RESULT_SUCCESS) {
        Log.e("khushank", "Job scheduled successfully!");
        Toast.makeText(this, "Job scheduled successfully!", Toast.LENGTH_LONG).show();
    } else {
        Log.e("khushank", "not able to start result: " + result);
    }
}

以下是我的简单作业服务,它只写日志

public class SampleJobService extends JobService {
    @Override
    public boolean onStartJob(JobParameters params) {

        Log.e("khushank","job started with id = "+params.getJobId());
        return false;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        Log.e("khushank","job Stopped with id = "+params.getJobId());
        return false;
    }
}

当我运行这个示例应用程序时,日志打印如下:

12-16 16:28:17.040 27119-27119/com.example.inkkashy02.myapplication E/khushank: Job scheduled successfully!
12-16 16:29:17.032 27119-27119/com.example.inkkashy02.myapplication E/khushank: job started with id = 1000

无法调试为什么在 Lollipop 中调用 onStartJob() 需要将近一分钟。 对于 Marshmallow,一旦安排了作业,它就会被调用。 请说出这个问题的根本原因。

【问题讨论】:

  • AFAIK,JobScheduler API 和文档中没有任何内容说第一份工作将立即发生。是什么让你觉得有问题?
  • @CommonsWare 由于我将 setRequiredNetworkType 保持为 NETWORK_TYPE_NONE 它应该在我安排它后立即启动作业。在我的情况下,作业调度程序返回 RESULT_SUCCESS 但 onStatJob() 不会立即调用,它需要随机数分钟。
  • @CommonsWare 由于我将 setRequiredNetworkType 保持为 NETWORK_TYPE_NONE 它应该在我安排它后立即启动作业。在我的情况下,作业调度程序返回 RESULT_SUCCESS 但 onStatJob() 不会立即调用,它需要随机数分钟。因此,根据您的说法,作业应该在 Job Scheduler 返回 RESULT_SUCCESS 时开始,为什么同一个 Job Scheduler 会立即在 Marshmallow 中运行。
  • “因为我将 setRequiredNetworkType 保持为 NETWORK_TYPE_NONE,所以我应该在安排它后立即启动作业”——请提供描述此行为的文档的链接,因为我没有看到这个记录在任何地方。 “为什么同一个 Job Scheduler 会立即在 Marshmallow 中运行”——AFAIK,它没有确切记录何时开始。对于setPeriodic(),我希望它首先发生在那个时期的某个地方。但是,您的一分钟时间可能太短了。

标签: android android-6.0-marshmallow android-5.1.1-lollipop android-jobscheduler


【解决方案1】:

聚会有点晚了,但我在我的 Oppo F1F 和 Android 5.1.1 上发现了完全相同的问题 - 在我测试过的后来的手机上还可以。我也尝试了 network none ,但即使使用以下应该强制即时性的方法也不是:

    JobInfo jobInfo = new JobInfo.Builder(++jobId, componentName)
            .setMinimumLatency(1)
            .setOverrideDeadline(1)
            .build();

我在别处读到 0 的最小延迟会导致此问题,因此设置为 1;如果未满足其他约束,则将覆盖期限设置为 1 应该是最大超时。公平地说,我从未尝试过 2。我的解决方案是只使用 Android 8 中的作业;我认为到那时我已经解决了错误!你有什么解决办法吗?

【讨论】:

  • 我切换到仅在 Android 8 上使用作业;但是,此后也不再将它们用于我的应用程序。原因是,尽管应用程序被列入打瞌睡的白名单(我需要醒来,我是一个 GPS 跟踪器,每隔几秒就记录一次),后台作业仍然会在某些手机上打瞌睡……但其他手机则不会。我认为 Android 9 有一些新的 API 可以解决这个用例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-26
相关资源
最近更新 更多