我们使用的 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。当应用程序打开时,此代码可以正常工作。 有什么想法吗?
ContextCompat 提供了获取主线程执行器的方法:
ContextCompat.getMainExecutor(context).execute {
// main Thread
}
或者使用Handler:
Handler(Looper.getMainLooper()).post {
// main Thread
}