在 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】:

考虑使用ListViewArrayAdapter。 Here 是一个关于该主题的好教程的链接。

这个想法是让你的后台任务更新支持数据,而不是直接让你的视图。支持数据是表示列表中每个项目的数据的项目集合。您的 AsyncTask 会这样做并更新集合中的项目。然后它会在ArrayAdapter 上调用notifyDataSetChanged() 以使其更新ListView

【讨论】:

以上是关于在 AsyncTask 回调后更新基于集合的 Widget RemoteViews的主要内容,如果未能解决你的问题,请参考以下文章

AsyncTask 的 Android 下载文件不适用于 3G 仅适用于 Wi-Fi

android asynctask向ui发送回调[重复]

AsyncTask 不从 postexecute 更新 UI

android asyncTask

在 AsyncTask 中使用回调函数时出现 NullpointerException

Android中的AsyncTask和接口回调使用详解