布局文件格式
<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;
}
@Override
public 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(){
@Override
public 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() {
@Override
public void run() {
try {
final Drawable drawable=Drawable.createFromStream(new URL(imgUrl).openStream(), "image.png");
//模拟网络延时
SystemClock.sleep(2000);
//在UI主线程更新显示
ImgService.this.post(new Runnable() {
@Override
public 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() {
@Override
public 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() {
@Override
public void run() {
callback.imageLoaded(drawable);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
});
return null;
}
/**
* 定义回调接口
* 用来设置目标对象的图像资源
*/
public interface ImgCallback{
public void imageLoaded(Drawable drawable);
}
}