`
- 浏览:
4065002 次
-
(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");
} catch (IOException e) {
}
Message message= handler2.obtainMessage() ;
message.arg1 = id;
message.obj = drawable;
handler2.sendMessage(message);
}
};
thread.start();
thread = null;
}
这样就简单实现了异步加载了。细想一下,还可以优化的,比如引入线程池、引入缓存等,我们先介绍线程池。
(3)引入ExecutorService接口,于是代码可以优化如下:
在主线程中加入:private ExecutorService executorService = Executors.newFixedThreadPool(5);
对应加载图像方法更改如下:
// 引入线程池来管理多线程
private void loadImage3(final String url, final int id) {
executorService.submit(new Runnable() {
public void run() {
try {
final Drawable drawable = Drawable.createFromStream(new URL(url).openStream(), "image.png");
handler.post(new Runnable() {
public void run() {
((ImageView) LazyLoadImageActivity.this.findViewById(id)).setImageDrawable(drawable);
}
});
} catch (Exception e) {
throw new RuntimeException(e);
}
}
});
}
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
详细解说STL 详细解说STL 详细解说STL 详细解说STL
在Android使用XMPP详细解说
android jni调用详细解说 简单易懂 绝对超值
详细解说STL排序 详细解说STL排序 详细解说STL排序
八段锦动作详细解说-精校版.doc
对用VC编写IME输入法程序进行了详细解说。 输入法输入法
java知识详细解说java知识详细解说java知识详细解说java知识详细解说java知识详细解说java知识详细解说java知识详细解说
电话机 部分电路详细解说 超好PPT文件
中文selinux手册和selinux详细解说,非常适合入门学习,很受用。
在上传数据到数据库中时,需要填写自己的ip和数据库账号密码
电话机 部分电路详细解说 电话机 部分电路详细解说 电话机 部分电路详细解说
BeanUtils详细解说BeanUtils详细解说BeanUtils详细解说BeanUtils详细解说BeanUtils详细解说
本文内容主要对三极管的工作原理进行解说,从三极管的结构讲起详细讲解三极管工作过程与放大原理等。 对三极管放大作用的理解,切记一点:能量不会无缘无故的产生,所以,三极管一定不会产生能量。但三极管厉害的...
电话机部分电路详细解电电话机部分电路详细解说话机部分电路详细解说说电话机部分电路详细解说
delphi 扫雷 带源代码 详细解说 图片 大致算法 简单版 适合新手 此程序 我小弟自己遍的碍才500来行 有缺点欢迎指出
对mtu的详细解说对mtu的详细解说对mtu的详细解说对mtu的详细解说
详细解说Cisco 3550端口限速,详细解说Cisco 3550端口限速
MySQL语句大全集锦+加详细解说(经典珍藏).doc
DWR 详细解说 官方DWR详细解说。 我自己使用 的。。方便查看
详细解说 STL 排序,可以下载看看。了解多点stl排序问题