WorkManager在Android 12 Android Kotlin中不能处理延迟 [英] Workmanager not working with delay in android 12 Android kotlin

查看:66
本文介绍了WorkManager在Android 12 Android Kotlin中不能处理延迟的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

嗨,我在科特林的WorkManager工作。我不理解一些代码,因此导致了这个错误。你能找人给我解释得更详细些吗?

2022-01-06 16:48:33.501 14483-14483/com.example.app E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.example.app, PID: 14483
        java.lang.IllegalArgumentException: Expedited jobs cannot be delayed
            at androidx.work.WorkRequest$Builder.build(WorkRequest.java:326)
            at com.example.app.tracker.TrackerHelper.setupNotificationWorkerForNextLaunch(TrackerHelper.kt:124)
            at com.example.app.tracker.TrackerHelper.setReminderOff(TrackerHelper.kt:36)
            at com.example.app.tracker.TrackerHelper.switchReminder(TrackerHelper.kt:70)
            at com.example.app.tracker.TrackerSettingsViewModel.switchReminder(TrackerSettingsViewModel.kt:34)
            at com.example.app.tracker.TrackerSettingsViewModel.enableReminder(TrackerSettingsViewModel.kt:100)
            at com.example.app.tracker.TrackerSettingsViewModel.setupReminderRow$lambda-1(TrackerSettingsViewModel.kt:85)
            at com.example.app.tracker.TrackerSettingsViewModel.lambda$5Q3PVjBphM6lb1pU0jZdN9GXKaE(Unknown Source:0)
            at com.example.app.tracker.-$$Lambda$TrackerSettingsViewModel$5Q3PVjBphM6lb1pU0jZdN9GXKaE.onCheckedChanged(Unknown Source:2)
            at android.widget.CompoundButton.setChecked(CompoundButton.java:222)
            at androidx.appcompat.widget.SwitchCompat.setChecked(SwitchCompat.java:1095)
            at androidx.appcompat.widget.SwitchCompat.toggle(SwitchCompat.java:1090)
            at android.widget.CompoundButton.performClick(CompoundButton.java:144)
            at android.view.View.performClickInternal(View.java:7418)
            at android.view.View.access$3700(View.java:835)
            at android.view.View$PerformClick.run(View.java:28676)
            at android.os.Handler.handleCallback(Handler.java:938)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loopOnce(Looper.java:201)
            at android.os.Looper.loop(Looper.java:288)
            at android.app.ActivityThread.main(ActivityThread.java:7839)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)

我试过这个solution它可以在Android 11或更低版本下运行。在那之后,我尝试了这个mediumPOST来运行Android 12,但是我得到了上面的错误。

我尝试的代码是

AndroidManifest.xml

    <provider
        android:name="androidx.startup.InitializationProvider"
        android:authorities="${applicationId}.androidx-startup"
        android:exported="false"
        tools:ignore="ExportedContentProvider"
        tools:node="merge">
        <meta-data
            android:name="androidx.work.WorkManagerInitializer"
            android:value="androidx.startup"
            tools:node="remove" />
    </provider>

1.能不能请谁详细解释一下上面的代码在做什么?

WorkerClass.kt

class WorkerClass(appContext: Context, workerParams: WorkerParameters) : Worker(appContext, workerParams){

    override fun doWork(): Result {
         // calling function
        return Result.success()
    }
}

HelperClass.kt

fun setupNotificationWorkerForNextLaunch() {
        val delayDuration = currentDate.timeInMillis
        val dailyWorkRequest = OneTimeWorkRequestBuilder<WorkerClass>()
            .setInitialDelay(delayDuration, TimeUnit.MILLISECONDS)
            .setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
            .addTag(REMINDER_WORK_TAG)
            .build()
        WorkManager.getInstance(Application.appContext).enqueue(dailyWorkRequest)
}

我从中级帖子添加了此代码

.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)

2.有人能解释一下如何在Android 12中实现这一点吗?我要在每天的特定时间创建通知。我如何通过WorkManager实现这一点。谢谢

推荐答案

WorkManager不保证您的工作在确切时间运行。而且大多数应用程序一开始就不需要它,除非你的应用程序是闹钟或日历应用程序。

如果您希望以大约24小时为基础定期运行某项操作,PeriodicWorkRequest是要使用的API。

使用setExpeditedAPI让WorkManager知道该请求对用户可能很重要,应该尽快运行。因此,对该API的延迟进行了限制。

这篇关于WorkManager在Android 12 Android Kotlin中不能处理延迟的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆