【问题标题】:Which Coroutine scope to use in AppWidgetProvider class?在 AppWidgetProvider 类中使用哪个协程范围?
【发布时间】: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 或其他操作,恕我直言,这一切都应该在服务内部(或 WorkManager worker 或其他)。

标签: android kotlin kotlin-coroutines coroutinescope


【解决方案1】:

如果你因为某种原因不得不使用协程,你应该使用 GlobalScope 否则它可以随时终止;除非您不在乎您的小部件是否获得结果,否则您的小部件可能仍然无法获得更新,这使得任务变得毫无意义。

无论如何,只要确保最小化更新调用的次数和协程的进程强度,否则你很容易消耗大量的内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 2019-05-02
    • 2019-04-27
    • 2020-10-22
    • 2022-08-18
    • 2019-06-22
    • 2021-04-02
    相关资源
    最近更新 更多