Android之handle异步加载图片

来源:互联网 发布:在手机上开淘宝店 编辑:程序博客网 时间:2024/06/05 09:36

布局文件格式

<TextView android:text="图片区域开始" .../><ImageView android:id="@+id/imageView1" android:src="@drawable/icon" .../><!-- 连续5张 id从imageView1到imageView5 源图片为icon --><TextView android:text="图片区域结束" .../>

 

方式一

Handler+Thread+Message

package com.singlee.handle;import java.net.URL;import android.app.Activity;import android.graphics.drawable.Drawable;import android.os.Handler;import android.os.Message;import android.os.SystemClock;import android.widget.ImageView;public class ImgHandle extends Handler{Activity context;public ImgHandle(Activity context){this.context=context;}@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);ImageView img=(ImageView)context.findViewById(msg.arg1);img.setImageDrawable((Drawable)msg.obj);}public void loadImg(final String imgUrl,final int viewId){Thread thread=new Thread(){@Overridepublic void run() {try {Drawable drawable=Drawable.createFromStream(new URL(imgUrl).openStream(), "img.png");Message msg=ImgHandle.this.obtainMessage();msg.arg1=viewId;msg.obj=drawable;//测试缓存模拟 网络延时SystemClock.sleep(2000);ImgHandle.this.sendMessage(msg);} catch (Exception e) {e.printStackTrace();}}};thread.start();thread=null;}}

在onCreate中加载

ImgHandle imgHandle=new ImgHandle(this);imgHandle.loadImg("http://www.baidu.com/img/baidu_logo.gif", R.id.imageView1);//持续加载5张图片


方式二

Handler+ExecutorService(线程池)+MessageQueue

package com.singlee.handle;import java.net.URL;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import android.app.Activity;import android.graphics.drawable.Drawable;import android.os.Handler;import android.os.SystemClock;import android.widget.ImageView;public class ImgService extends Handler{Activity context;private ExecutorService imgService=Executors.newFixedThreadPool(5);public ImgService(Activity context){this.context=context;}public void loadImg(final String imgUrl,final int viewId){//在线程池中下载图片imgService.submit(new Runnable() {@Overridepublic void run() {try {final Drawable drawable=Drawable.createFromStream(new URL(imgUrl).openStream(), "image.png");//模拟网络延时SystemClock.sleep(2000);//在UI主线程更新显示ImgService.this.post(new Runnable() {@Overridepublic void run() {ImageView img=(ImageView)context.findViewById(viewId);img.setBackgroundDrawable(drawable);}});} catch (Exception e) {e.printStackTrace();}}});}}


方式三

Handler+ExecutorService+MessageQueue+缓存

package com.singlee.handle;import java.lang.ref.SoftReference;import java.net.URL;import java.util.HashMap;import java.util.Map;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import android.graphics.drawable.Drawable;import android.os.Handler;import android.os.SystemClock;public class AsyncImgLoader extends Handler{/** * 图片缓存<br/> * android为内存优化提供两个类:SoftReference 和 WeakReference<br/> * 解决内存不足的错误(OutOfMemoryError)<br/> */public Map<String, SoftReference<Drawable>> imgCache=new HashMap<String, SoftReference<Drawable>>();//创建线程池private ExecutorService imgService=Executors.newFixedThreadPool(5);/** * 加载网络图片 * @param imageUrl * @return */public Drawable loadImgDrawable(final String imageUrl,final ImgCallback callback){if(imgCache.containsKey(imageUrl)){SoftReference<Drawable> reference=imgCache.get(imageUrl);if(reference!=null)return reference.get();}imgService.submit(new Runnable() {@Overridepublic void run() {try {SystemClock.sleep(2000);final Drawable drawable=Drawable.createFromStream(new URL(imageUrl).openStream(), "image.png");imgCache.put(imageUrl, new SoftReference<Drawable>(drawable));AsyncImgLoader.this.post(new Runnable() {@Overridepublic void run() {callback.imageLoaded(drawable);}});} catch (Exception e) {e.printStackTrace();}}});return null;}/** * 定义回调接口 * 用来设置目标对象的图像资源 */public interface ImgCallback{public void imageLoaded(Drawable drawable);}}