进一步优化Android ListView GridView中异步加载图片

  次阅读 作者:智能小宝 来源:互联网 2015-11-26 09:31 我要评论(0)

最近在对编写完后的FileManager做优化,发觉其中异步加载图片的那块代码还需要在重构一下。

首先我先说明一下,该FileManager中显示文件图标的控件为GridView,并且最大可视区域为20个图标,就是因为要同时显示20个才给我惹了大麻烦。

简单地说是由于测试部在对FileManager的稳定性进行非常暴力的测试发生的问题,他们极其迅速地多次上下来回滑动GridView,创建过 多AsyncTask导致了CPU无法负荷而发生ANR。这个问题也是由于之前我对android线程的了解还不够深入所引发的。AsyncTask本质 是属于线程池,多次new所消耗的资源远远超过了Thread,这就是为什么AsyncTask比较适合简短、少次的异步操作。下面是官方解释:

AsyncTask is designed to be a helper class around Thread and Handler and does not constitute a generic threading framework. AsyncTasks should ideally be used for short operations (a few seconds at the most.) If you need to keep threads running for long periods of time, it is highly recommended you use the various APIs provided by the java.util.concurrent pacakge such as Executor, ThreadPoolExecutor and FutureTask.

并且那是每次触发getView时如果cache中没有图片的bitmap话,就会new AsyncTask来执行获取缩略图的操作,这样的后果就是那段代码变成了垃圾。因此我就从网上寻找可行的优化方案,找到了一个比较靠谱的http://cindy-lee.iteye.com/blog/1300818,这回监听了Scroll状态,new的子线程是少了,可是我仔细想了想,感觉他的代码还是可以进一步优化(七楼就是我提的两个改进方案)。我的终极优化方案就是应用启动时就专门创建一个子线程来根据ScrollListener的状态执行解析缩略图的操作。

终于黄天不服有心人,还真让我在MIUI的FileExplore源码android的Contacts源码中找到了。

SyncThumbnailExtractor是异步提取缩略图的主类,最主要的就是继承于HandlerThread的ExtractorThread,通过mExtractorHandler = new Handler(getLooper(), this)创建唯一的线程,产成消息队列,这样它会无限循环地处理send进来的Message,执行提取缩略图的操作。好了,不废话,直接代码

public class SyncThumbnailExtractor implements Callback{

private static final String LOADER_THREAD_NAME = "FileIconLoader";

/**

* Type of message sent by the UI thread to itself to indicate that some

* thumbnails need to be extracted.

*/

private static final int MESSAGE_REQUEST_EXTRACTING = 1;

/**

* Type of message sent by the loader thread to indicate that some thumbnails

* have been extracted.

*/

private static final int MESSAGE_THUMBNAIL_EXTRACTED = 2;

private boolean mPaused;

private boolean mDecodingRequested = false;

final Handler mMainHandler = new Handler(this);

ExtractorThread mExtractorThread;

private Context mContext ;

private final ConcurrentHashMap<ImageView, FileInfo> mPendingRequests = new ConcurrentHashMap<ImageView, FileInfo>();

private final static ConcurrentHashMap<String, ImageHolder> mImageCache = new ConcurrentHashMap<String, ImageHolder>();

private static abstract class ImageHolder {

public static final int NEEDED = 0;

public static final int EXTRACTING = 1;

public static final int EXTRACTED = 2;

int state;

public static ImageHolder create(String mime) {

if(mime == null)

return null;

if(mime.contains(ThumbnailUtils.APK)){

return new DrawableHolder();

}

else if(MediaFile.isImageByMimeType(mime) ||

MediaFile.isVideoByMimeType(mime)){

return new BitmapHolder();

}

return null;

};

public abstract boolean setImageView(ImageView v);

public abstract boolean isNull();

public abstract void setImage(Object image);

}

private static class BitmapHolder extends ImageHolder {

SoftReference<Bitmap> bitmapRef;

@Override

public boolean setImageView(ImageView v) {

if (bitmapRef.get() == null)

return false;

v.setImageBitmap(bitmapRef.get());

本站文章信息来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • 未来两年人工智能要怎么走?看这篇就够了

    未来两年人工智能要怎么走?看这篇就够了

  • 韩春雨称已能重复实验结果 近期将有消息公布

    韩春雨称已能重复实验结果 近期将有消息公布

  • 英国研发“杀生”机器人 通过生命体获取能量

    英国研发“杀生”机器人 通过生命体获取能量

  • 无人驾驶汽车如何改变城市生活?听听他们怎么说

    无人驾驶汽车如何改变城市生活?听听他们怎么说

网友点评网友点评
阅读推荐阅读推荐

据国外媒体报道,在过去两年内,聊天机器人(chatbot)、人工智能以及机器学习的研发和采用取得了巨大进展。许多初创公司正利用人工智能和...

霍金 视觉中国 图 英国著名物理学家霍金(Stephen Hawking)再次就人工智能(AI)发声,他认为:对于人类来说,强大AI的出现可能是最美妙的...

文|郑娟娟 今年,人工智能(AI) 60岁了。在AI60岁的时候,笔者想要介绍一下AI100,一个刚刚2岁的研究项目,但它的预设寿命是100年,甚至更长...

AlphaGo与李世石的人机大战,为大众迅速普及了人工智能的概念。 但对谷歌而言,除了下围棋,现在的人工智能进展到哪一步了?未来,人工智能...