现在的位置: 首页 > 综合 > 正文

异步加载图片

2013年08月17日 ⁄ 综合 ⁄ 共 2272字 ⁄ 字号 评论关闭

(http://www.javaeye.com/topic/743672)

    前几天记得说要分享一下异步下载加载图片的经验,最近一直在研究Cocos2d,把这事耽误了。今天就写了写 

 

如果不怕图片那个内存溢出的bug的话。可以使用ListView,GridView等等,如果担心这个问题,可以使用ImageView

 

既然是异步加载,那就采用多线程下载吧。 这个例子里面也就用了一个线程池

 

1.

//初始化线程池

Java代码 
  1. ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5103,TimeUnit.SECONDS,new LinkedBlockingQueue<Runnable>());  

 

2.

    //构建一个ListView

Java代码 
  1. listView = (ListView) findViewById(R.id.listview);  

 

3.

   //启动一个下载列表的线程

 

Java代码 
  1. threadPool.execute(new LoadImagesListThread());  

 

4.

 

Java代码 
  1.        /** 
  2.  * 下载图片列表的线程 
  3.  * @author zhu 
  4.  * 
  5.  */  
  6. class LoadImagesListThread extends Thread{  
  7.     @Override  
  8.     public void run() {  
  9.   
  10.         //TODO 获取下载图片列表的  
  11.         datas = HttpUtils.LoadImagesList();   
  12.   
  13.         if(datas != null && datas.size()>0){  
  14.               
  15.             //通知显示列表  
  16.             handler.sendEmptyMessage(SHOW_IMAGES);  
  17.               
  18.             //循环启动线程下载图片  
  19.             for (int i = 0; i < datas.size(); i++) {  
  20.                 threadPool.execute(new LoadImageThread());  
  21.             }  
  22.         }else{  
  23.             //TODO 通知没有数据  
  24.             handler.sendEmptyMessage(NO_IMAGES);  
  25.         }  
  26.     }  
  27.       
  28. }  

5.

下载图片的线程如下,很简单

 

Java代码 
  1. class LoadImageThread extends Thread{  
  2.       
  3.     int position;  
  4.       
  5.     public LoadImageThread(int position){  
  6.         this.position = position;  
  7.     }  
  8.       
  9.     @Override  
  10.     public void run() {  
  11.         //TODO 下载图片。这个下载方法里面可以先判断是否本地缓存有,如果有,就读缓存。没有就下载,再写缓存  
  12.         datas.get(position).bitmap = HttpUtils.loadImage(datas.get(position).url);  
  13.         handler.sendEmptyMessage(SHOW_IMAGE);  
  14.     }  
  15.       
  16. }  

6.

handler里面主要做些刷新的工作

 

Java代码 
  1. Handler handler = new Handler(){  
  2.     public void handleMessage(android.os.Message msg) {  
  3.         switch (msg.what) {  
  4.         case SHOW_IMAGES:  
  5.             adapter = new MyAdapter();  
  6.             listView.setAdapter(adapter);  
  7.             break;  
  8.         case NO_IMAGES:  
  9.             Toast.makeText(MainActivity.this"no images", Toast.LENGTH_LONG).show();  
  10.             break;  
  11.         case SHOW_IMAGE:  
  12.             adapter.notifyDataSetChanged();  
  13.             break;  
  14.         default:  
  15.             break;  
  16.         }  
  17.           
  18.     };  
  19. };  

 

 

至此一个简单的异步加载图片的功能完成了。

 

图片太多。使用ListView,GridView的时候会报内存溢出的错误,我的经验是320x480大小的12张左右必报。坛子里也讨论了许久,没有结果,都是缩放图片或者避开这个大量图片的问题。我就采用的是避开大量图片的方法。过几天再写出来

抱歉!评论已关闭.