是否可以在Android上使用WorkManager在主线程上运行作业?

问题描述 投票:0回答:1

我们使用的 SDK 需要在主线程上进行调用。对于需要使用 WorkManager 每天在后台运行一次的 Worker,我设置了:

@HiltWorker
class MyWorker @AssistedInject constructor(
    @Assisted context: Context,
    @Assisted workerParams: WorkerParameters,
    val mySdkRepo: MyRepository
): CoroutineWorker(context, workerParams) {
override suspend fun doWork(): Result {
    withContext(Dispatchers.Main) {
    mySdkRepo.callFunc()
    }
}

但出现以下错误:

java.lang.IllegalStateException: Event bus [Bus "default"] accessed from non-main thread null
at com.squareup.otto.ThreadEnforcer$2.enforce(ThreadEnforcer.java:47)
at com.squareup.otto.Bus.register(Bus.java:188)

似乎无法在主线程上运行代码。我什至尝试过使用 runBlocking。当应用程序打开时,此代码可以正常工作。 有什么想法吗?

android kotlin-coroutines android-workmanager
1个回答
0
投票

ContextCompat 提供了获取主线程执行器的方法:

ContextCompat.getMainExecutor(context).execute {
  // main Thread
}

或者使用Handler:

Handler(Looper.getMainLooper()).post {  
 // main Thread
}
© www.soinside.com 2019 - 2024. All rights reserved.