我遇到了一个问题,试图找出最佳的解决方案来设置异步(不是通过下载)到复杂布局中的多个imageView的Bitmaps。这主要在ListView中完成,但可以跨多个共享相同图像的ListView。我使用Thrift进行数据通信到我的图像渲染过程(我无法改变)。我必须进行图像渲染请求并等待包含共享内存中我可以拉取图像数据字节的回调。所以Thrift请求方法可能如下所示:
long renderID = thriftClient.openRenderRequest(renderRequest);
其中renderRequest包含我想要呈现的内容的ID信息以及我需要的尺寸(ID不是Android中的视图ID,而是特定于基于配置呈现图像的内容)。返回值是与此请求关联的ID,在查看回调数据时使用。我使用这个renderID作为我在请求中发送的内容的密钥(我需要的图像的ID)然后,我会在稍后的某个时间点收到回调,如下所示:
public void onJobUpdate(JobUpdate job) ...
我得到的JobUpdate对象包含我从初始请求获得的renderID和我可以使用的共享内存位置" pull"来自(使用JNI,我的抽象)的图像数据。现在,我可以通过查找'来查看呈现的图像。这个renderID是我提交请求时给出的那个。通过这样做,我可以跟踪视图并相应地更新它。我这样做是通过让一些自定义对象包含一个引用图像视图和图像的ID(包含在渲染请求中)。我基本上有一个包含所有这些映射的大型列表并触发图像更新,传递Bitmap和我想要更新的ID。这里的问题是这些对象中的每一个都会运行这个方法(都具有相同的接口),即使它们没有相同的ID。它看起来效率非常低,我希望有一种更简单的方法。此外,在处理ListView时它会变得很糟糕,因为视图会被回收,我需要关闭旧请求并生成新的渲染请求。竞争条件可能发生在这些列表视图的情况下。
我还尝试保留对视图的引用,并将其绑定到我在提交请求时使用的renderID(使用HashMap)。这是我在ListViews中真正获得竞争条件的地方,因为视图被回收。有时我会在这里显示错误的图像,因为在使用ImageView位图区域(在UI线程中)并使用另一个工作线程关闭渲染作业之前,我可能已经在工作线程上收到了作业更新。任何帮助表示赞赏。