用Java concurrent编写异步加载图片功能

8
回复
365977
查看
[复制链接]

206

主题

1622

帖子

2721

安币

Android大神

Rank: 6Rank: 6

发表于 2011-11-7 20:59:27 | 显示全部楼层 |阅读模式
android异步加载ListView中的图片中使用异步方式加载的图片,当时要的急,写的很粗糙,是为每个图片加载一个线程来实现的。
可以用java concurrent很简明的实现类似功能,并且用到线程池。
这里加载的图片,都是从网上直接获取的。如果用android的UI线程,则需要图片全部加载后才能显示界面。
这里使用了concurrent api通过后台线程并发获取,本例中线程池中只有一个线程,可以设置为多个以加快加载速度。可参见使用java concurrent处理并发需求中的简单示例了解concurrent api的基本机制。
代码不复杂:
  1. package com.easymorse.lazyload;

  2. import java.net.URL;
  3. import java.util.concurrent.ExecutorService;
  4. import java.util.concurrent.Executors;

  5. import android.app.Activity;
  6. import android.graphics.drawable.Drawable;
  7. import android.os.Bundle;
  8. import android.os.Handler;
  9. import android.widget.ImageView;

  10. public class LazyLoadImageActivity extends Activity {

  11.     private ExecutorService executorService = Executors.newFixedThreadPool(1);

  12.     /** Called when the activity is first created. */
  13.     @Override
  14.     public void onCreate(Bundle savedInstanceState) {
  15.         super.onCreate(savedInstanceState);
  16.         setContentView(R.layout.main);
  17.         loadImage("http://www.chinatelecom.com.cn/images/logo_new.gif", R.id.image1);
  18.         loadImage("http://www.baidu.com/img/baidu_logo.gif", R.id.image2);
  19.         loadImage("http://cache.soso.com/30d/img/web/logo.gif", R.id.image3);
  20.     }

  21.     @Override
  22.     protected void onDestroy() {
  23.         executorService.shutdown();
  24.         super.onDestroy();
  25.     }

  26.     private void loadImage(final String url, final int id) {
  27.         final Handler handler=new Handler();
  28.         executorService.submit(new Runnable() {
  29.             @Override
  30.             public void run() {
  31.                 try {
  32.                     final Drawable drawable = Drawable.createFromStream(
  33.                             new URL(url).openStream(), "image.png");
  34.                     handler.post(new Runnable() {

  35.                         @Override
  36.                         public void run() {
  37.                             ((ImageView) LazyLoadImageActivity.this
  38.                                     .findViewById(id))
  39.                                     .setImageDrawable(drawable);
  40.                         }
  41.                     });
  42.                 } catch (Exception e) {
  43.                     throw new RuntimeException(e);
  44.                 }
  45.             }
  46.         });
  47.     }
  48. }
复制代码
完整源代码见:
http://easymorse.googlecode.com/svn/tags/lazy.load.image-0.2.0/
可以对比一下不做异步处理的示例:
http://easymorse.googlecode.com/svn/tags/lazy.load.image-0.1.0/

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

0

主题

37

帖子

29

安币

初级码农

Rank: 1

QQ
发表于 2012-4-5 22:05:17 | 显示全部楼层
努力学习。。。

0

主题

115

帖子

139

安币

程序猿

Rank: 2

发表于 2012-10-17 16:15:17 | 显示全部楼层
不错,顶一个.

30

主题

73

帖子

439

安币

攻城狮

码农

Rank: 3Rank: 3

QQ
发表于 2012-11-1 17:34:39 | 显示全部楼层
学习了~{:Skateboard:}

1

主题

55

帖子

0

安币

初级码农

Rank: 1

发表于 2012-12-10 21:30:13 | 显示全部楼层
学习了,非常感谢

0

主题

42

帖子

517

安币

程序猿

NO1

Rank: 2

QQ达人

QQ
发表于 2013-3-8 17:53:43 | 显示全部楼层
顶一个。。。
力争上游

0

主题

61

帖子

448

安币

程序猿

Rank: 2

发表于 2013-3-29 10:46:32 | 显示全部楼层
好好学习

1

主题

233

帖子

1484

安币

Android大神

Rank: 6Rank: 6

QQ达人

发表于 2013-7-17 09:09:08 | 显示全部楼层
DDDDDDDDDDDD
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:1294855032@qq.com

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )