在 AsyncTask 回调后更新基于集合的 Widget RemoteViews
Posted
技术标签:
【中文标题】在 AsyncTask 回调后更新基于集合的 Widget RemoteViews【英文标题】:Updating collection-based Widget RemoteViews after AsyncTask callback 【发布时间】:2018-01-01 00:13:39 【问题描述】:我的 Widget 的 ListView 的元素依赖于通过 AsyncTask 通过网络获取的内容。我的 RemoteViewsFactory 实现中 getViewAt 的代码如下:
val preRendered = RemoteViews(context.packageName, R.layout.list_item_layout)
MyAsyncTask(preRendered).execute()
return preRendered
并且AsyncTask被定义为一个内部类
private inner class MyAsyncTask(val remoteViews: RemoteViews) : AsyncTask<Void, Void, Bitmap>()
override fun doInBackground(vararg nothing: Void): Bitmap = <fetch image from internet synchronously>
override fun onPostExecute(result: Bitmap) = remoteViews.setImageViewBitmap(R.id.imageview, result)
我的基本思路是,我应该将一些默认布局渲染到 RemoteViews 并将其返回以插入到列表中,然后允许网络操作在后台进行。然后,我在同一个 RemoteViews 实例上对 AsyncTask 的 onPostExecute 方法进行修改,我相信这在理论上应该会导致实际列表元素被更新。然而,尽管 onPostExecute 正在运行并且视图被填充了它的初始布局,但图像永远不会被设置。有人对如何实现这一目标有任何想法吗?
事后思考:我试过只使用 TextView 并在 AsyncTask 中设置一些静态文本,但这也不起作用。
【问题讨论】:
文本视图也是列表项布局的一部分吗?如果是这样,您可能需要致电列表中的invalidateViews
。
我会在什么上调用 invalidateViews?拥有提供 RemoteViewsFactoryAdapter 的 RemoteViewsService 的整个架构让我很困惑,不知道系统的哪个部分需要通知更新以使行无效。
在名单上。您的小部件有一个 getViewAt
返回特定项目的视图。更新remoteViews
后,使列表视图无效。看看这是否有帮助或改变什么。
【参考方案1】:
考虑使用ListView
和ArrayAdapter
。 Here 是一个关于该主题的好教程的链接。
这个想法是让你的后台任务更新支持数据,而不是直接让你的视图。支持数据是表示列表中每个项目的数据的项目集合。您的 AsyncTask
会这样做并更新集合中的项目。然后它会在ArrayAdapter
上调用notifyDataSetChanged()
以使其更新ListView
。
【讨论】:
以上是关于在 AsyncTask 回调后更新基于集合的 Widget RemoteViews的主要内容,如果未能解决你的问题,请参考以下文章
AsyncTask 的 Android 下载文件不适用于 3G 仅适用于 Wi-Fi
AsyncTask 不从 postexecute 更新 UI