Android异步加载图像(含线程池,缓存方法)

研究了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);            }        };  

对应加载图像代码如下:对应加载图像代码如下:对应加载图像代码如下:

// 引入线程池来管理多线程       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);                  }              }          });      }  

(4)为了更方便使用我们可以将异步加载图像方法封装一个类,对外界只暴露一个方法即可,考虑到效率问题我们可以引入内存缓存机制,做法是

建立一个HashMap,其键(key)为加载图像url,其值(value)是图像对象Drawable。先看一下我们封装的类

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/ppgjs.html