为了账号安全,请及时绑定邮箱和手机立即绑定

NewsAsyncTask 类中 为什么在处理完图片后要 mTask.remove(this);

public void loadImages(int start, int end) {
    for (int i = start; i < end; i++) {
        String url = NewsAdapter.URLS[i];
        Bitmap bitmap = getBitmapFromCache(url);
        //如果没有,调用线程下载
        if (bitmap == null) {
            //调用即下载图片
            NewsAsyncTask task = new NewsAsyncTask(url);
            task.execute(url);
            mTask.add(task);
        } else {
            ImageView imageView = (ImageView) mListView.findViewWithTag(url);
            imageView.setImageBitmap(bitmap);
        }
    }
}

在调用NewsAsyncTask该类的最后mTask.remove(this); 视频里老师说的是图片加载完成后删除。但我有一个疑问,mTask最开始应该是空的,程序首先调用的就是remove而不是add。那么这里我就已经不能理解了。其次remove后,又在该类执行完后,把task又加了回去,我也不理解这个。相关的两行代码代码:

task.execute(url); 

mTask.add(task);   

 求懂得同学们指教。

正在回答

1 回答

启动:执行onScroll(),在当前可见item添加相应task。所以最开始mTask不为空。

ps:(onScroll()方法在ListView启动和绘制时会不断被回调)

在当前可见item中,一个item加载后,即该ImageLoader中的线程执行完毕,就会remove task。

再加载下一个item,即开启新线程.....

当滚动停止后,就为当前可见item每个item依次开启新的线程,继续add,并加载item。

0 回复 有任何疑惑可以回复我~
#1

Veritas丶 提问者

非常感谢!
2015-08-24 回复 有任何疑惑可以回复我~
#2

大强强

mTask.remove(this);这个解释还是不是很懂,当我滚动lisview时,即调用mImageLoader.cancelAllTask(),我在ImageLoader的cancelAllTask方法中输出mTask集合的size是0。如果是0,那么取消什么?
2016-02-10 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
Android必学-异步加载
  • 参与学习       50627    人
  • 解答问题       311    个

了解Android中的异步加载处理方法,这是面试问的最多的知识点

进入课程

NewsAsyncTask 类中 为什么在处理完图片后要 mTask.remove(this);

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信