【问题标题】:Periodic job in Android Job Scheduler not working as expectedAndroid Job Scheduler 中的定期作业未按预期工作
【发布时间】:2021-03-17 17:42:08
【问题描述】:

我需要在指定的时间间隔内将数据从服务器同步到我的本地设备,因为我使用的是 Android JobScheduler。但它没有按预期工作。例如,我每 30 分钟安排一次定期工作,在它第一次正常工作时。但是下次作业在 15 分钟之前执行,我调试了间隔时间,但始终是 30 分钟。

仅第一次正常工作。

这是待处理的作业信息日志:

Service Name ->ComponentInfo{my pakage name.services.SyncServiceFare}Time Interval->1800000}

Service Name ->ComponentInfo{my pakage name.services.SyncService}Time Interval->1800000}

这是我的代码:

private fun schedulePeriodicJob(JOB_ID: Int, fetchInterval: Long) {
        jobScheduler = getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler?
        var serviceName : ComponentName? = null
        try {
            if (jobScheduler == null) {
                return
            }
            jobScheduler?.cancel(JOB_ID)

            serviceName = if(JOB_ID == 1){
                ComponentName(this, SyncService::class.java)
            }else{
                ComponentName(this, SyncServiceFare::class.java)
            }
            val builder = JobInfo.Builder(JOB_ID, serviceName)
                .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
                .setBackoffCriteria(60000, JobInfo.BACKOFF_POLICY_EXPONENTIAL)
                .setPersisted(true)

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                builder.setPeriodic(
                    TimeUnit.MINUTES.toMillis(fetchInterval),
                    JobInfo.getMinFlexMillis()
                )
            } else {
                builder.setPeriodic(TimeUnit.MINUTES.toMillis(fetchInterval))
            }
            val extras = PersistableBundle()
            val scheduleTime = System.currentTimeMillis()
            extras.putLong("SCHEDULE_TIME", scheduleTime)
            builder.setExtras(extras)
            jobScheduler?.schedule(builder.build())
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

我该如何解决这个问题?

【问题讨论】:

    标签: android kotlin android-jobscheduler


    【解决方案1】:

    您为 JobScheduler 设置的周期仅意味着该进程将在与该周期一样大的时间窗口内执行。你不知道它什么时候运行:系统会计算执行任务的最佳时间(可能与其他计划任务一起分组),以减少电池使用并尽可能长时间保持手机处于空闲状态。

    下一次计划执行将在另一个窗口内,该时间在任务完成后立即开始。这就是为什么您会看到不一致的时间,这是设计使然。

    如果您需要在准确的时间执行作业,那么您应该查看 AlarmManager 的 setExact 方法,但强烈建议不要这样做,因为它会对设备的电池消耗产生负面影响。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多