我正在阅读Android培训中的processing bitmaps off the UI thread章节。 在本章中,作者讨论了在与AsyncTask结合使用时处理GridView的并发性:
ListView和GridView等公共视图组件引入了另一个组件 与AsyncTask一起使用时的问题,如中所示 上一节。为了有效记忆,这些 组件在用户滚动时回收子视图。如果每个孩子都看 触发AsyncTask,无法保证在完成时, 相关视图尚未被回收用于另一个视图 儿童观。此外,无法保证其中的订单 异步任务启动是他们完成的顺序。
对于上一段,我有两个问题:
(1)GridView的子视图是什么? 以下图为例,每个网格都是子视图吗?
(2)我很困惑“如果每个子视图触发AsyncTask,则无法保证在完成时,相关视图尚未被回收用于另一个子视图。” 谁能解释更多细节?例如,grid [1,1]触发AsyncTask,当AsyncTask完成时,为什么会出现问题?
答案 0 :(得分:2)
是的,每个网格项都是子View
。
AsyncTask的主要目的是在主线程上处理长时间运行的作业,因此UI不会挂起。在内部,AsyncTask
使用具有固定线程数的ThreadPoolExecutor来管理任务。因此,即使你发射了二十AsyncTask
秒,它们中也只有一些会一次执行。同时,由于每个AsyncTask
都在其自己的线程中运行,因此它可能随时完成,具体取决于系统决定如何安排线程。因此,确实无法确保任务以相同的顺序完成。
当您从主线程处理图像时,还需要考虑以下场景。
在AdapterView
中,我们会回收子视图,这样每次在屏幕上滚动View
时我们都不需要初始化新的View
。因此,在这种情况下会发生的情况是,View
儿童会在屏幕上显示图片时触发AsyncTask
来获取图片。
但是在获取图像之前,用户继续滚动并且视图滚动离开屏幕并再次出现在另一侧(因为我们正在回收视图)。现在,它触发另一个AsyncTask
来获取它应该显示的图像。与此同时,与此视图关联的早期AsyncTask
完成并设置此View
的图像,即使它不是图像的正确位置。