【发布时间】:2020-10-23 04:06:43
【问题描述】:
假设我有一个启动工人的活动。在工人内部,我做了一个伪挂起过程,然后我从数据库中打印出一个结果。这是代码
启动worker的activity是
class SplashActivity: BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_splash)
val oneTimeRequest = OneTimeWorkRequest.Builder(MyWorker::class.java).setInputData(Data.Builder().apply {
putInt("data", 1)
}.build()).addTag("worktag").build()
WorkManager.getInstance(applicationContext).enqueue(oneTimeRequest)
}
}
工人在下面
class MyWorker @AssistedInject constructor(
@Assisted private val appContext: Context,
@Assisted private val params: WorkerParameters,
private val serverRepository: ServerRepository
) : CoroutineWorker(appContext, params) {
override suspend fun doWork(): Result {
GlobalScope.launch {
for (i in 0..10) {
println("$i")
delay(1000)
}
val servers = serverRepository.getServers()
runOnUiThread {
Toast.makeText(appContext, "${servers.firstOrNull()?.serverAddress}", Toast.LENGTH_SHORT).show()
}
}
return Result.success()
}
}
所以结果是我在 logcat 中看到 system.out 和 1,2,3... 然后我看到了 toast 消息。 但是,当我在计数器仍在计数的情况下从最近完全杀死应用程序时,我永远不会看到 toast 消息。 为什么会发生这种情况,因为我有一个 GlobalScope 协程? 这样做的正确方法是什么??
【问题讨论】:
-
我不确定我是否理解您的问题。如果您终止该应用程序,则不应期望发生其他任何事情。如果它被杀死,它就会被杀死。应用程序中发生的任何事情都不会比应用程序更长寿。
-
使用前台服务并在服务内部执行你的操作。这样即使您的应用程序杀死它仍然执行您的逻辑
标签: android kotlin coroutine android-workmanager