【发布时间】: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后,使列表视图无效。看看这是否有帮助或改变什么。
标签: java android multithreading android-widget kotlin