2

我正在探索 Android 开发者网站并阅读一些文章。有一种方法可以使用 AsyncTask 在列表视图中延迟加载图像:

// Using an AsyncTask to load the slow images in a background thread
new AsyncTask<ViewHolder, Void, Bitmap>() {
    private ViewHolder v;

    @Override
    protected Bitmap doInBackground(ViewHolder... params) {
        v = params[0];
        return mFakeImageLoader.getImage();
    }

    @Override
    protected void onPostExecute(Bitmap result) {
        super.onPostExecute(result);
        if (v.position == position) {
            // If this item hasn't been recycled already, hide the
            // progress and set and show the image
            v.progress.setVisibility(View.GONE);
            v.icon.setVisibility(View.VISIBLE);
            v.icon.setImageBitmap(result);
        }
    }
}.execute(holder);

但是,对我来说,该代码似乎存在一些问题。假设我们从 Internet 加载图像,它们每个都需要几秒钟的时间来加载。

作为用户,如果我们滚动列表然后切换到另一个活动,将会有一些 AsyncTask 在后台运行并占用一些带宽,而我们可能在新的前台活动中需要它。

您通常如何使用他们的方法处理这种情况?回收视图时,您是否杀死了与持有者关联的 AsyncTask?您是否在适配器中跟踪哪些 AsyncTasks 仍在运行并在活动停止时将它们全部取消?还有其他方法吗?

我的问题主要是关于架构清理部件以解决该问题(而不是实现)

4

1 回答 1

2

我会说大多数时候下载并没有花费足够的时间来解决这个问题,但如果是这样,你应该杀死它们。同样在他们的实现中,他们下载图像并检查视图是否已被重用。如果你有很长的延迟,你应该在重用时取消任务。请注意,任务的执行顺序因 Android 版本而异。从文档

首次引入时,AsyncTask 在单个后台线程上串行执行。从 DONUT 开始,这被更改为允许多个任务并行运行的线程池。从 HONEYCOMB 开始,任务在单个线程上执行,以避免并行执行导致的常见应用程序错误。

如果你真的想要并行执行,你可以使用 THREAD_POOL_EXECUTOR 调用 executeOnExecutor(java.util.concurrent.Executor, Object[])。

于 2012-09-19T17:18:44.057 回答