【发布时间】:2022-07-25 03:24:03
【问题描述】:
我目前正在创建一个小部件,我正在使用配置活动配置小部件并在 AppWidgetProvider 的 onUpdate() 上初始化小部件。之后,CoroutineWorker 将不时更新小部件。我已将 updatePeriodMillis 设置为 0。 所以我的代码就是
override fun onUpdate(context: Context?, appWidgetManager: AppWidgetManager?, appWidgetIds: IntArray?) {
if(!widget_configured)
{
//configure widget & start the service.
}
}
所以我的问题是我可以用协程将代码包装在 onUpdate 函数中吗?如果是这样,我应该使用什么范围。是 GlobalScope.launch{},还是我需要创建一个范围。 使用这样的东西安全吗?
private val job = SupervisorJob()
private val coroutineScope = CoroutineScope(Dispatchers.IO + job + CoroutineExceptionHandler { _, ex ->
ex.printStackTrace()
})
override fun onUpdate(context: Context?, appWidgetManager: AppWidgetManager?, appWidgetIds: IntArray?) {
coroutineScope.launch {
if(!widget_configured)
{
//configure widget & start the service.
}
}
}
或
override fun onUpdate(context: Context?, appWidgetManager: AppWidgetManager?, appWidgetIds: IntArray?) {
GlobalScope.launch(Dispatchers.IO) {
if(!widget_configured)
{
//configure widget & start the service.
}
}
}
在 appwidgetprovider 中运行协程是最安全的方法。请帮帮我。
【问题讨论】:
-
一旦
onUpdate()返回,您的进程可以随时终止。如果您需要执行 I/O 或其他操作,恕我直言,这一切都应该在服务内部(或WorkManagerworker 或其他)。
标签: android kotlin kotlin-coroutines coroutinescope