如何解决JobScheduler - 如何跳过定期作业的第一个作业运行?
在我的应用程序中,我设置了一个定期作业,该作业设置为每 30 分钟运行一次。 第一次作业运行发生在我安排该定期作业时,这在我的情况下是不需要的。 我想要的是跳过第一次运行,以便在 30+ 分钟后第一次运行。
我对如何解决这个问题的两个想法是,要么让它在前 30 分钟内以某种方式根本不运行(某种延迟),要么在有机会开始之前将第一个作业标记为已运行。
不幸的是,我在 JobInfo
中没有找到任何方法可以让我做到这些。
满足我需求的另一种解决方法是以某种方式限制作业仅在应用程序处于后台时发生。它并不能完全解决问题,但在我的情况下可以作为一种解决方法。
以下是我当前用于安排定期作业的代码:
private void scheduleJob() {
ComponentName componentName = new ComponentName(this,myRecurringTask.class);
JobInfo info = new JobInfo.Builder(JOB_ID,componentName)
.setrequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.setPersisted(true)
.setPeriodic(1800000)
.build();
JobScheduler scheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
scheduler.schedule(info);
}
希望有人遇到同样的情况并能帮我解决...谢谢!
解决方法
使用 WorkManager
安排后台工作,请参阅介绍 here。
1.添加依赖:
implementation "androidx.work:work-runtime-ktx:2.4.0"
2.创建工人类:
class DataRefresher(context: Context,params: WorkerParameters) : CoroutineWorker(context,params) {
override suspend fun doWork(): Result { //will run on background thread
//your logic
return try {
//your logic
Result.success()
} catch (e: HttpException) {
Result.retry()
}
}
}
3.创建应用程序类:
class DevBytesApplication : Application() {
private val backgroundScope = CoroutineScope(Dispatchers.Default) //standard background thread
override fun onCreate() { //called when app launches,same as Activity
super.onCreate()
initWork()
}
private fun initWork() {
backgroundScope.launch { //run in background,not affecting ui
setupDataRefreshingWork()
}
}
@SuppressLint("IdleBatteryChargingConstraints")
private fun setupDataRefreshingWork() {
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.UNMETERED) //when using wifi
.setRequiresBatteryNotLow(true)
.setRequiresCharging(true)
.setRequiresDeviceIdle(true) //when not running heavy task
.build()
val repeatingRequest = PeriodicWorkRequestBuilder<DataRefresher>(1,TimeUnit.DAYS) //【15 minutes is minimum!!】
.setConstraints(constraints)
.setInitialDelay(30,TimeUnit.MINUTES) //【initial delay!!】
.build()
WorkManager.getInstance(this).enqueueUniquePeriodicWork(
DataRefresher::class.java.simpleName,//work name
ExistingPeriodicWorkPolicy.KEEP,//if new work comes in with same name,discard it
repeatingRequest
)
}
}
4.设置 AndroidManifest:
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.devbytestest">
<application
android:name=".DevBytesApplication" //【here,must!!!】
...
</application>
</manifest>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。