Android中实现图片的异步加载学习笔记
来源:互联网 发布:上海数据港代码 编辑:程序博客网 时间:2024/04/27 18:01
在平时写android程序的时候,要实现加载图片,还要考虑到系统的性能,我们需要实现图片的异步加载,这样使用缓存的和去网络下载的两种方式;
当我们有个要加载图片的请求的时候,我们先去缓存中寻找,如果缓存中没有,那就去网络上面去下载,然后再把下载到的图片放入到缓存中,最后来显示要加载的图片;
下面我是画出来的一张简
每次下载图片成功,我们都保存到缓存,但是还要考虑到一个垃圾回收的机制,系统中我们把每次图片都保存起来但是如果缓存太多了也不行;此时我们需要用到
一个软引用SoftReference类:用这个类可以来实现简单的缓存,当要响应内存需要时候,垃圾收集器会去决定是否回收该软引用对象;
这个类中包含一个方法是
public T get()
- 返回此引用对象的指示对象。如果此引用对象已经由程序或垃圾回收器清除,则此方法将返回
null
。下面的Demo 是我今天看mars老师的异步加载图片的视频,mars老师写的,自己也好好理解了一下加载流程,现在贴出来和大家一起分享学习一下
主Activity类
package cn.edu.nuc.image;import android.app.Activity;import android.graphics.drawable.Drawable;import android.os.Bundle;import android.widget.ImageView;public class MainActivity extends Activity { /** Called when the activity is first created. */private AsyncImageLoader loader = new AsyncImageLoader(); @Override 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);}}}
回调类:package cn.edu.nuc.image;import android.graphics.drawable.Drawable;import android.widget.ImageView;public class CallbackImpl implements AsyncImageLoader.ImageCallback{private ImageView imageView ;public CallbackImpl(ImageView imageView) {super();this.imageView = imageView;}@Overridepublic void imageLoaded(Drawable imageDrawable) {imageView.setImageDrawable(imageDrawable);}}
异步加载图片类package cn.edu.nuc.image;import java.lang.ref.SoftReference;import java.net.URL;import java.util.HashMap;import java.util.Map;import android.graphics.drawable.Drawable;import android.os.Handler;import android.os.Message;//该类的主要作用是实现图片的异步加载public class AsyncImageLoader {// 图片缓存对象// 键是图片的URL,值是一个SoftReference对象,该对象指向一个Drawable对象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() {@Overridepublic 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);};}.start();return null;}// 该方法用于根据图片的URL,从网络上下载图片protected Drawable loadImageFromUrl(String imageUrl) {try {// 根据图片的URL,下载图片,并生成一个Drawable对象return Drawable.createFromStream(new URL(imageUrl).openStream(),"src");} catch (Exception e) {throw new RuntimeException(e);}}// 回调接口public interface ImageCallback {public void imageLoaded(Drawable imageDrawable);}}
下面效果截图":
- Android中实现图片的异步加载学习笔记
- Android中实现图片的异步加载学习笔记
- Android 实现图片缓存异步加载框架学习笔记
- Android异步加载学习笔记之二:实现ListView中的图片数据从网络加载
- Android异步加载学习笔记之三:用AsyncTask实现ListView中的图片数据加载
- Android 实现图片的异步加载
- Android中网络图片的异步加载
- Android中图片的异步加载
- Android 实现异步加载图片
- Android学习笔记————异步图片加载
- Android学习笔记(二)之异步加载图片
- android中listView实现异步加载网络图片
- android中listView实现异步加载网络图片
- 在Android中实现ListView图片异步加载一
- android图片的异步加载和双缓存学习笔记——DisplayImageOptions
- android图片的异步加载和双缓存学习笔记——DisplayImageOptions
- android图片的异步加载和双缓存学习笔记——DisplayImageOptions
- android图片的异步加载和双缓存学习笔记——DisplayImageOptions
- sql server性能分析--检测数据库阻塞语句
- 使用ioctl与内核交换数据
- 使用WSDL发布WebService(第二部分)简单对象访问协议——学习SOAP语法和使用SOAP发布WSDL
- nfs根文件系统中内核模块不能卸载
- appfuse环境搭建
- Android中实现图片的异步加载学习笔记
- 智器Q5 covia android 1101内核启动分析
- 用咒语操作PC——Voice Activated Commands语音识别
- dwr反推技术
- 使用WSDL发布WebService(第一部分)——Web Service 和WSDL简介
- Linux系统上安装DS4000的多路径软件RDAC
- uboot环境变量(设置bootargs向linux内核传递正确的参数)(
- 防止程序多开方法
- 获取父进程备忘