android CoroutineWorker因没有getForegroundInfo而崩溃

cbwuti44  于 2023-03-16  发布在  Android
关注(0)|答案(3)|浏览(170)

我尝试将一些网络调用迁移到WorkManager CoroutineWorkers,以利用失败时的自动重试和调度功能。
这是我写的工人:

@HiltWorker
class RefreshSubscriptionDetailsWorker
@AssistedInject constructor(
    @Assisted appContext: Context,
    @Assisted workerParams: WorkerParameters
) :
    CoroutineWorker(appContext, workerParams) {

    override suspend fun doWork(): Result {
        return Result.success()
    }
}

BaseApplication中配置请求的代码:

val refreshSubscriptionDetailsRequest =
            OneTimeWorkRequestBuilder<RefreshSubscriptionDetailsWorker>()
                .build()

        WorkManager
            .getInstance(applicationContext)
            .enqueue(refreshSubscriptionDetailsRequest)

我已经按照文档中的说明进行了操作,以确保正确插入了Hilt:
一个二个一个一个
我遇到的问题是,当它排队时,它崩溃,并出现以下异常:

Fatal Exception: java.lang.IllegalStateException: Not implemented
       at androidx.work.CoroutineWorker.getForegroundInfo$suspendImpl(CoroutineWorker.kt:100)
       at androidx.work.CoroutineWorker.getForegroundInfo()
       at androidx.work.CoroutineWorker$getForegroundInfoAsync$1.invokeSuspend(CoroutineWorker.kt:134)
       at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
       at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
       at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:571)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:678)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:665)

如果我打算使用一个加急请求,我希望我需要实现getForegroundInfo函数,但在这个例子中我不需要,因为我不要求加急请求,或者说我已经相信了教程中getForegroundInfo实现的缺失,以及补丁说明中指出您需要一个用于加急请求的ForegroundService:补丁程序注解
我使用的是WorkManager 2.7.1,Hilt 2.41,尝试在Android版本8到12上运行它。

h9a6wy2h

h9a6wy2h1#

您需要在CoroutineWorker类中覆盖suspend fungetForegroundInfo(),并在那里返回公共ForegroundInfo(int notificationId,@NonNull通知通知)。

xdyibdwo

xdyibdwo2#

从您的工作请求中删除.setExpedited(OutOfQuotaPolicy.DROP_WORK_REQUEST)。瓦尔工作请求= OneTimeWorkRequestBuilder<...>().addTag(...).build()就这么做吧,这是我的工作

4jb9z9bj

4jb9z9bj3#

解决方案是重写你的协程工作者的getForegroundInfo()方法。

class MyWorker(workerParameters: WorkerParameters) : CoroutineWorker(workerParameters) {

    override suspend fun getForegroundInfo(): ForegroundInfo {
        return ForegroundInfo(notificationId, Notification(...))
    }
}

让我来解释一下。使用协程工作者,这会在以下两种情况下发生:
1.当您在工作线程中调用setForeground()时
1.当您在Android 13或更低版本上运行时对工作请求调用setExpedited()时。因为Android 13或更低版本最终将调用setForground()。
在后台,当您在工作进程中调用setForeground()时,它会使用ForegroundService,而ForegroundService会调用getForegroundInfo()方法来相应地显示通知。
现在,如果您检查CoroutineWorker类中的getForegroundInfo()方法,您将得到以下内容:

public open suspend fun getForegroundInfo(): ForegroundInfo {
    throw IllegalStateException("Not implemented")
}

你看,问题就在那里,如果你不重写getForegroundInfo()方法,最终它会抛出IllegalStateException Not implemented错误。

相关问题