在AsyncTask回调之后更新基于集合的Widget RemoteViews

时间:2017-07-25 21:40:46

标签: java android multithreading android-widget kotlin

我的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方法进行修改,我认为理论上应该导致实际的list元素被更新。但是,尽管运行onPostExecute并且视图使用其初始布局填充,但从不设置图像。有没有人对如何实现这一点有任何想法?

事后的想法:我尝试过使用TextView并在AsyncTask中设置一些静态文本,但这也无效。

1 个答案:

答案 0 :(得分:0)

考虑使用for sock in socks { if !counts.contains(sock) { counts[sock] = 1 } else { counts[sock] = counts[sock] + 1 } } ListViewHere是指向该主题的一个好教程的链接。

我们的想法是让您的后台任务更新后备数据,而不是直接查看您的视图。支持数据是表示列表中每个项目的数据的项目集合。您的ArrayAdapter会做这件事并更新集合中的项目。然后,它会调用AsyncTask上的notifyDataSetChanged()来更新ArrayAdapter