
Android 异步加载图像小结
来源:互联网作者:未知时间:2011-05-21 20:03:25点击:844评论:0
本文地址:http://www.getcn.net/index.php?mod=skill&action=detail&id=44038 [复制]
http://blog.csdn.net/sgl870927/archive/2011/03/29/6285535.aspx
研究了 android 从网络上异步加载图像,现总结如下:
(1)由于 android UI 更新支持单一线程原则,所以从网络上取数据并更新到界面上,为了不阻塞主线程首
先可能会想到以下方法。
在主线程中 new 一个 Handler 对象,加载图像方法如下所示
private void loadImage(final String url, final int id) {
handler.post(new Runnable() {
public void run() {
Drawable drawable = null;
try {
drawable = Drawable.createFromStream(new URL(url).openStream(),
"image.png");
} catch (IOException e) {
}
((ImageView)
LazyLoadImageActivity.this.findViewById(id)).setImageDrawable(drawable);
}
});
}
上面这个方法缺点很显然,经测试,如果要加载多个图片,这并不能实现异步加载,而是等到所有的图片
都加载完才一起显示,因为它们都运行在一个线程中。
然后,我们可以简单改进下,将 Handler+Runnable 模式改为 Handler+Thread+Message 模式不就能实现
同时开启多个线程吗?
(2)在主线程中 new 一个 Handler 对象,代码如下:
final Handler handler2=new Handler(){
@Override
public void handleMessage(Message msg) {
((ImageView)
LazyLoadImageActivity.this.findViewById(msg.arg1)).setImageDrawable((Drawable)msg.obj);
}
};
对应加载图像代码如下:
//采用 handler+Thread 模式实现多线程异步加载
private void loadImage2(final String url, final int id) {
Thread thread = new Thread(){
@Override
public void run() {
Drawable drawable = null;
try {
drawable = Drawable.createFromStream(new URL(url).openStream(),
"image.png");