1

我正在阅读Android 培训中从 UI 线程处理位图的章节。在本章中,作者谈到了 GridView 与 AsyncTask 结合使用时的并发处理:

ListView 和 GridView 等常见视图组件在与 AsyncTask 结合使用时会引入另一个问题,如上一节所示。为了提高内存效率,这些组件在用户滚动时回收子视图。如果每个子视图都触发了一个 AsyncTask,则无法保证当它完成时,关联的视图还没有被回收用于另一个子视图。此外,不能保证异步任务的启动顺序就是它们完成的顺序。

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

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

(2) 我很困惑“如果每个子视图都触发了一个 AsyncTask,则不能保证当它完成时,关联的视图还没有被回收用于另一个子视图。” 谁能解释得更详细些?比如grid[1,1]触发了一个AsyncTask,当AsyncTask完成后,为什么会出现问题呢?

在此处输入图像描述

4

1 回答 1

2
  1. 是的,每个网格项都是一个 Child View

  2. AsyncTask的主要目的是在主线程之外处理长时间运行的作业,这样 UI 就不会挂起。在内部,anAsyncTask使用具有固定数量线程的ThreadPoolExecutor来管理任务。因此,即使您启动了 20 个AsyncTasks,一次也只会执行其中的几个。同时,由于每个都AsyncTask在自己的线程中运行,它可能随时完成,具体取决于系统决定如何安排您的线程。因此,确实不能保证任务将以相同的顺序完成。

当您在主线程之外处理图像时,您还需要考虑以下场景。

AdapterViews 中,我们回收了子视图,这样我们就不需要View每次View在屏幕上滚动 a 时都初始化新的 s。所以在这种情况下会发生什么,当它出现在屏幕上时,一个 ChildView将触发一个AsyncTask来获取图像。

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

于 2013-05-02T17:28:51.320 回答