gpt4 book ai didi

android - 在 RemoteViewsFactory 的 onDataSetChanged 中使用协程 runBlocking() 是否安全?

转载 作者:行者123 更新时间:2023-12-05 04:26:09 24 4
gpt4 key购买 nike

我正在尝试获取一些最新的电影图像并将它们显示在 Android 应用小部件中,根据要求,小部件应每小时刷新一次以获取最新的电影图像。

由于我在整个应用程序中使用协程,因此我需要使用现有的具有挂起功能的改造服务来获取数据。

根据 Android 文档,在 RemoteViewsFactory 的 onDataSetChanged 内部执行大量操作是安全的,因此我使用此方法本身而不是 WorkManger 从服务中获取数据,因为它有其自身的缺点。看这里 ( https://commonsware.com/blog/2018/11/24/workmanager-app-widgets-side-effects.html )

Called when notifyDataSetChanged() is triggered on the remote adapter.This allows a RemoteViewsFactory to respond to data changes byupdating any internal references. Note: expensive tasks can be safelyperformed synchronously within this method. In the interim, the olddata will be displayed within the widget.

在下面的代码 fragment 中,我正在使用 runBlocking() 进行阻塞改造调用...否则将在获取数据之前触发获取 View 。这样安全吗?

注意:适配器也会在 MyWidgetProvider 的 onUpdate 方法中每隔一小时通知一次

override fun onUpdate(
context: Context,
appWidgetManager: AppWidgetManager,
appWidgetIds: IntArray
) {
....
appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.listViewMovies)
.....
}

代码示例:MyRemoteViewsFactory:RemoteViewsFactory {

override fun onDataSetChanged() {
try {
fetchFromServer()
} catch (e: Exception) {
clear()
}
}

private fun fetchFromServer() = runBlocking {
job = launch {
service.getMovieList?.also {
data = it
}
}
}

private fun clear(){
job?.cancel()
job = null
data = null
log("Cleared")
}

override fun onDestroy() {
clear()
}

Console log shows onDestory() s being called... but in different binder.

onCreate _main
1 _Binder:11940_5
2 _Binder:11940_5
3 _Binder:11940_5
4 _Binder:11940_5
5 _Binder:11940_5
6 _Binder:11940_5
7 _Binder:11940_5
8 _Binder:11940_5
9 _Binder:11940_5
10 _Binder:11940_5

11 _Binder:11940_5
onDestroy _Binder:11940_2
Clear called _Binder:11940_2

所以我的查询:

  1. 在 onDataSetChanged 方法中使用 runBlocking 是否安全?
  2. 在 runBlocking 中创建嵌套协程以取消协程是否安全?有没有更好的办法?
  3. 在 onDataSetChanged() 中从网络获取数据是否安全。
  4. 我无法在 onDataSetChanged() 中进行异步调用。那么我们是否可以在不使用 runBlocking() 的情况下处理

注意:此题专门针对Android App Widget RemoteViewsFactory onDataSetChanged()的实现。

最佳答案

使用 viewModel/lifeCycle 范围,runBlocking 将阻塞 UI 线程。

关于android - 在 RemoteViewsFactory 的 onDataSetChanged 中使用协程 runBlocking() 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73097689/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com