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

作者:jj120522

更多相关文章

  1. ContentProvider基本使用
  2. Android数据库升级、降级、创建(onCreate() onUpgrade() onDowng
  3. ANDROID 在eclipse中没有出现AVD的解决方法
  4. Android(安卓)SwipeRefreshLayout 自动刷新
  5. Android-Opengl 实现图片滤镜功能
  6. View 绘制流程
  7. 通过adb shell dumpsys命令获取当前应用的component
  8. Android(安卓)Studio 自定义Gradle Plugin
  9. android 由资源名称获得ID的方法

随机推荐

  1. 关于android Widgets桌面小插件的开发大
  2. 【Android】用Android(安卓)Studio创建第
  3. 两篇关于Android App Widgets 的文章
  4. Android ContentProvider的使用
  5. Android源码编译make的错误处理
  6. Android RadioButton 文字在左边
  7. GCM(5)Working with MAVEN and Android O
  8. Android开发―利用FrameLayout实现图标中
  9. RecycleView滚动条添加
  10. Android 获取标题栏的高度