展会信息港展会大全

android Listview 软引用SoftReference异步加载图片
来源:互联网   发布日期:2015-11-26 10:22:33   浏览:1324次  

导读:HashMapString, SoftReferenceDrawable imageCache 关于SoftReference这个类多少知道些机制,会用就ok了。 机制:简单来说,她会帮助我们管理内存,防止内存溢出,另外一点也就相当于map,临时缓存些图片......

HashMap<String, SoftReference<Drawable>> imageCache 关于SoftReference这个类多少知道些机制,会用就ok了。

机制:简单来说,她会帮助我们管理内存,防止内存溢出,另外一点也就相当于map,临时缓存些图片drawable让我们可以直接引用,很好了解决了OOM异常.

实现代码片段:

[java]

package com.Tianyou.Mobile.Common;

import java.io.IOException;

import java.io.InputStream;

import java.lang.ref.SoftReference;

import java.net.MalformedURLException;

import java.net.URL;

import java.util.HashMap;

import com.Tianyou.Mobile.Util.MyUtil;

import android.graphics.Bitmap;

import android.graphics.drawable.BitmapDrawable;

import android.graphics.drawable.Drawable;

import android.os.Handler;

import android.os.Message;

/***

* 异步加载图片 缓存的实现

*

* @author jia

*

*/

public class AsyncImageLoader {

// 软引用

private HashMap<String, SoftReference<Drawable>> imageCache;

public AsyncImageLoader() {

imageCache = new HashMap<String, SoftReference<Drawable>>();

}

/***

* 下载图片

*

* @param imageUrl

*图片地址

* @param imageCallback

*回调接口

* @return

*/

public Drawable loadDrawable(final String imageUrl,

final ImageCallback imageCallback) {

if (imageCache.containsKey(imageUrl)) {

SoftReference<Drawable> softReference = imageCache.get(imageUrl);

Drawable drawable = softReference.get();

if (drawable != null) {

return drawable;

}

}

final Handler handler = new Handler() {

public void handleMessage(Message message) {

imageCallback.imageLoaded((Drawable) message.obj, imageUrl);

}

};

// 开启线程下载图片

new Thread() {

@Override

public void run() {

Drawable drawable = loadImageFromUrl(imageUrl);

// 将下载的图片保存至缓存中

imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));

Message message = handler.obtainMessage(0, drawable);

handler.sendMessage(message);

}

}.start();

return null;

}

/***

* 根据URL下载图片(这里要进行判断,先去本地sd中查找,没有则根据URL下载,有则返回该drawable)

*

* @param url

* @return

*/

public static Drawable loadImageFromUrl(String imageURL) {

Bitmap bitmap = MyUtil.GetBitmap(imageURL, 100);

Drawable drawable = new BitmapDrawable(bitmap);

return drawable;

}

// 回调接口

public interface ImageCallback {

public void imageLoaded(Drawable imageDrawable, String imageUrl);

}

}

上面这个类斯通见惯了,大部分都是这样实现的,我现在要讲一点,也是迷惑我很久了一点(回调接口运用)本人基础不好,所以卡在这里了,

在listview中的getview方法中要调用这个方法:

代码片段:

[java]

public Drawable getDrawable(AsyncImageLoader asyncImageLoader,

String imageUrl, final ImageView imageView) {

Drawable drawable = asyncImageLoader.loadDrawable(imageUrl,

new ImageCallback() {

@Override

public void imageLoaded(Drawable imageDrawable,

String imageUrl) {

if (imageDrawable != null)

imageView.setImageDrawable(imageDrawable);

else

imageView.setImageResource(R.drawable.u6_normal);

}

});

return drawable;

}

这个方法作用:获取软用中的图片,其实在我们首次进入listview中的时候,软应用是不起作用的,只是用来下载图片保存至sd卡和软引用中.这个方法就是执行了这些操作,对于参数imageView 就是在要把获取的drawable设置进去.

执行的顺利:首先我们调用的是loadDrawable这个方法,然后查找软引用中有没有该drawable,没有的话则线程下载,下载ok后会执行 handleMessage中imageCallback.imageLoaded((Drawable) message.obj, imageUrl);然后执行我们已经实现了这个接口.

在getiview 中执行代码片段:

[java]

Drawable drawable = getDrawable(asyncImageLoader, Image_L,

holder.iv_image);

if(drawable!=null)

holder.iv_image.setImageDrawable(drawable);

当我们下滑动后,然后在上滑动的时候软应用起到了效果,效率很快哦,可以和新浪聘美了,呵呵,玩笑,要优化的地方还很多.

赞助本站

人工智能实验室

相关热词: SoftReference 异步加载

AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港