SoftReference
SoftReference<Object> srf = new SoftReference<Object>(new Object());
//虚拟内存不足时,会回收对象
//需要获取对象时可以调用get()方法,如:
Object obj = srf.get();//如果已经被回收,为null
希望被回收,但是也想引用它
SoftReference无法阻止对象被垃圾回收器回收
图片异步加载过程
以URL作为key,以图片作为value保存图片—缓存
异步加载的实现
1、异步加载图片类
public class AsyncImageLoader {
//图片缓存对象
//key是图片URL,值是SoftReference对象(指向Drawble)
private Map<String, SoftReference<Drawable>> imageCache = new HashMap<String, SoftReference<Drawable>>();
//实现图片的异步加载
public Drawable loadDrawable(final String imageUrl,final ImageCallback callback){
//查询缓存,查看当前需要下载的图片是否已经存在于缓存当中
if(imageCache.containsKey(imageUrl)){
SoftReference<Drawable> softReference=imageCache.get(imageUrl);
if(softReference.get() != null){//存在该图片缓存
return softReference.get();
}
}
/*-------------------------
* 保证加载好后通知显示
*-------------------------*/
final Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
callback.imageLoaded((Drawable) msg.obj);//加载图片
}
};
//新开辟一个线程,该线程用于进行图片的下载
new Thread(){
public void run() {
Drawable drawable=loadImageFromUrl(imageUrl);//加载图片
imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));//放入
Message message = handler.obtainMessage(0, drawable);//
handler.sendMessage(message);//发送message,用于通知接收方进行显示
};
}.start();
return null;
}
//该方法用于根据图片的URL,从网络上下载图片
protected Drawable loadImageFromUrl(String imageUrl) {
try {
//根据图片的URL,下载图片,并生成一个Drawable对象
return Drawable.createFromStream(new URL(imageUrl).openStream(), "src");//从inputstream创建drawable;"src"用于调试的,暂时没什么用
} catch (Exception e) {
throw new RuntimeException(e);
}
}
//回调接口
public interface ImageCallback{
public void imageLoaded(Drawable imageDrawable);
}
}
2、回调接口
public class CallbackImpl implements AsyncImageLoader.ImageCallback{
private ImageView imageView ;
public CallbackImpl(ImageView imageView) {
super();
this.imageView = imageView;
}
@Override
public void imageLoaded(Drawable imageDrawable) {
imageView.setImageDrawable(imageDrawable);
}
}
3、使用
public class MainActivity extends Activity {
private AsyncImageLoader loader = new AsyncImageLoader();
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
loadImage("http://www.android.com/images/icon-partners.png", R.id.imageView01);
loadImage("http://www.android.com/images/icon-dev.png", R.id.imageView02);
loadImage("http://www.android.com/images/icon-market.png", R.id.imageView03);
}
//url:下载图片的URL
//id:ImageView控件的ID
private void loadImage(final String url, final int id) {
// 如果缓存过就会从缓存中取出图像,ImageCallback接口中方法也不会被执行
ImageView imageView = (ImageView)findViewById(id);
CallbackImpl callbackImpl = new CallbackImpl(imageView);
Drawable cacheImage =
loader.loadDrawable(url, callbackImpl);
if (cacheImage != null) {
imageView.setImageDrawable(cacheImage);
}
}
}