gpt4 book ai didi

Android 9 总是在 onStartJob 返回 true 后立即调用 onStopJob

转载 作者:太空狗 更新时间:2023-10-29 13:02:53 26 4
gpt4 key购买 nike

我有一个预定的工作实现如下:

class RefreshImageService : JobService() {
override fun onStartJob(params: JobParameters): Boolean {
info { "RefreshImage: start job" }
appCoroScope.launch {
fetchImageAndUpdateWidget()
info { "RefreshImage: finished" }
jobFinished(params, false)
}
return true
}

override fun onStopJob(params: JobParameters): Boolean {
info { "RefreshImage: stop job" }
return true
}
}

在日志中,我总是在 RefreshImage: start job 之后立即看到 RefreshImage: stop job,然后,RefreshImage: finished,这意味着 Android 立即释放了我的唤醒锁,并且我的服务只是偶然地被允许完成。如果 HTTP 请求花费更长的时间,它可能会被杀死。

这是我声明服务的方式:

<service
android:name=".RefreshImageService"
android:permission="android.permission.BIND_JOB_SERVICE"
/>

我是这样安排的:

val jobInfo = JobInfo.Builder(refreshImageJobId, 
ComponentName(context, RefreshImageService::class.java))
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.setMinimumLatency(latencyMillis)
.setOverrideDeadline(HOUR_IN_MILLIS)
.build()
context.jobScheduler.schedule(jobInfo)

有什么地方我做错了吗,或者有什么变通方法可以使 Android 正常运行?

最佳答案

我意识到问题出在 fetchImageAndUpdateWidget() 中,它还必须根据当前 HTTP 结果的 Last-Modified header 处理安排下一次图像提取。如果 Android 在到达调度代码之前决定终止我的工作,我的工作将永远不会再次运行。

为防止这种情况,我添加了一行在发出 HTTP 请求之前临时安排作业。然而,根据 JobScheduler.schedule() 的文档,这导致 Android 尝试立即停止我当前的工作:

If a job with the given ID is currently running, it will be stopped.

这让我无法稳健地实现我的调度行为。我不得不求助于另一个预定作业,只是为了检查我的主要作业是否丢失了它的预定。

关于Android 9 总是在 onStartJob 返回 true 后立即调用 onStopJob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53029813/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com