我尝试将一些网络调用迁移到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上运行它。
3条答案
按热度按时间h9a6wy2h1#
您需要在CoroutineWorker类中覆盖suspend fungetForegroundInfo(),并在那里返回公共ForegroundInfo(int notificationId,@NonNull通知通知)。
xdyibdwo2#
从您的工作请求中删除.setExpedited(OutOfQuotaPolicy.DROP_WORK_REQUEST)。瓦尔工作请求= OneTimeWorkRequestBuilder<...>().addTag(...).build()就这么做吧,这是我的工作
4jb9z9bj3#
解决方案是重写你的协程工作者的getForegroundInfo()方法。
让我来解释一下。使用协程工作者,这会在以下两种情况下发生:
1.当您在工作线程中调用setForeground()时
1.当您在Android 13或更低版本上运行时对工作请求调用setExpedited()时。因为Android 13或更低版本最终将调用setForground()。
在后台,当您在工作进程中调用setForeground()时,它会使用ForegroundService,而ForegroundService会调用getForegroundInfo()方法来相应地显示通知。
现在,如果您检查CoroutineWorker类中的getForegroundInfo()方法,您将得到以下内容:
你看,问题就在那里,如果你不重写getForegroundInfo()方法,最终它会抛出IllegalStateException Not implemented错误。