【问题标题】:Workmanager not working with delay in android 12 Android kotlinWorkmanager 无法在 android 12 Android kotlin 中延迟工作
【发布时间】:2022-01-06 17:16:14
【问题描述】:

嘿,我在 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 或更低版本中工作。之后我尝试了这个medium 帖子来运行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 实现这一点。谢谢

【问题讨论】:

  • AndroidManifest.xml 中添加的 XML 删除了 WorkManager 的默认初始化,并允许您进行自定义初始化:developer.android.com/topic/libraries/architecture/workmanager/… 只有在您有自己的自定义初始化时才应该使用它。
  • @pfmaggi 你知道如何在 workmanager 中使用 setExpedited 并有延迟吗?

标签: android kotlin android-service android-workmanager


【解决方案1】:

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

如果您想大约 24 小时定期运行某项内容,PeriodicWorkRequest 是要使用的 API。

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

【讨论】:

  • 我想像闹钟一样使用工作管理器。所以PeriodicWorkRequest 可以吗?
  • 不会的。 WorkManager 在设备允许时执行工作,而不是不必要地唤醒它。
  • 那么像报警管理器一​​样需要使用哪个api呢?
  • 我希望用户根据自己的方便选择时间来触发工作管理器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多