与AsyncTask一起使用时处理GridView的并发

时间:2013-05-02 17:08:25

标签: android android-gridview

我正在阅读Android培训中的processing bitmaps off the UI thread章节。 在本章中,作者讨论了在与AsyncTask结合使用时处理GridView的并发性:

  

ListView和GridView等公共视图组件引入了另一个组件   与AsyncTask一起使用时的问题,如中所示   上一节。为了有效记忆,这些   组件在用户滚动时回收子视图。如果每个孩子都看   触发AsyncTask,无法保证在完成时,   相关视图尚未被回收用于另一个视图   儿童观。此外,无法保证其中的订单   异步任务启动是他们完成的顺序。

对于上一段,我有两个问题:

(1)GridView的子视图是什么? 以下图为例,每个网格都是子视图吗?

(2)我很困惑“如果每个子视图触发AsyncTask,则无法保证在完成时,相关视图尚未被回收用于另一个子视图。” 谁能解释更多细节?例如,grid [1,1]触发AsyncTask,当AsyncTask完成时,为什么会出现问题?

enter image description here

1 个答案:

答案 0 :(得分:2)

  1. 是的,每个网格项都是子View

  2. AsyncTask的主要目的是在主线程上处理长时间运行的作业,因此UI不会挂起。在内部,AsyncTask使用具有固定线程数的ThreadPoolExecutor来管理任务。因此,即使你发射了二十AsyncTask秒,它们中也只有一些会一次执行。同时,由于每个AsyncTask都在其自己的线程中运行,因此它可能随时完成,具体取决于系统决定如何安排线程。因此,确实无法确保任务以相同的顺序完成。

  3. 当您从主线程处理图像时,还需要考虑以下场景。

    AdapterView中,我们会回收子视图,这样每次在屏幕上滚动View时我们都不需要初始化新的View。因此,在这种情况下会发生的情况是,View儿童会在屏幕上显示图片时触发AsyncTask来获取图片。

    但是在获取图像之前,用户继续滚动并且视图滚动离开屏幕并再次出现在另一侧(因为我们正在回收视图)。现在,它触发另一个AsyncTask来获取它应该显示的图像。与此同时,与此视图关联的早期AsyncTask完成并设置此View的图像,即使它不是图像的正确位置。