进一步优化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!

人工智能实验室
相关文章相关文章
  • Oculus公布原型机,大幅度提升可视角,能实现140°的视场水平

    Oculus公布原型机,大幅度提升可视角,能实现140°的视场水平

  • Michael I. Jordan带你解读百万奖金ATEC蚂蚁人工智能大赛

    Michael I. Jordan带你解读百万奖金ATEC蚂蚁人工智能大赛

  • 2018深圳国际人工智能展览会 2018 shenzhen International Artif

    2018深圳国际人工智能展览会 2018 shenzhen International Artif

  • teamLab创始人猪子寿之: 抛去衣食住行,我还剩下什么?

    teamLab创始人猪子寿之: 抛去衣食住行,我还剩下什么?

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

据外媒报道,STEER打造了首款完全自动驾驶停车技术,旨在使常规车辆转变为无人驾驶车辆。STEER的首款技术应用是4级自动驾驶及网络安全停车...

近日,美国软性机器抓手制造商 Soft Robotics 宣布,获得 2000 万美元的融资,本轮投资者包括 Scale Venture Partners,Calibrate Ventures...

据外媒报道,加州车管局发布了《2017自动驾驶脱离报告(California Autonomous Vehicle Disengagement Reports)》,其中谈及了脱离的具体...

用人机语音交互,来解决智能家居适老的问题;通过家庭门禁与安防套件、空气净化套件、可燃气体与有害气体监控套件等相互联动,在不同生活情...