Android异步加载图片

 

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

 

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

 

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

 

1.

//初始化线程池

 

ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 10, 3,TimeUnit.SECONDS,new LinkedBlockingQueue<Runnable>());  
 

 

 

2.

    //构建一个ListView

 

 

listView = (ListView) findViewById(R.id.listview);
 

 

 

3.

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

 

 

threadPool.execute(new LoadImagesListThread());
 

 

4.

 

       /** 
 * 下载图片列表的线程 
 * @author zhu 
 * 
 */  
class LoadImagesListThread extends Thread{  
    @Override  
    public void run() {  
  
        //TODO 获取下载图片列表的  
        datas = HttpUtils.LoadImagesList();   
  
        if(datas != null && datas.size()>0){  
              
            //通知显示列表  
            handler.sendEmptyMessage(SHOW_IMAGES);  
              
            //循环启动线程下载图片  
            for (int i = 0; i < datas.size(); i++) {  
                threadPool.execute(new LoadImageThread());  
            }  
        }else{  
            //TODO 通知没有数据  
            handler.sendEmptyMessage(NO_IMAGES);  
        }  
    }  
      
}  
 

 

 

5.

下载图片的线程如下,很简单class LoadImageThread extends Thread{

      
    int position;  
      
    public LoadImageThread(int position){  
        this.position = position;  
    }  
      
    @Override  
    public void run() {  
        //TODO 下载图片。这个下载方法里面可以先判断是否本地缓存有,如果有,就读缓存。没有就下载,再写缓存  
        datas.get(position).bitmap = HttpUtils.loadImage(datas.get(position).url);  
        handler.sendEmptyMessage(SHOW_IMAGE);  
    }  
      
}  
 

 

6.

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

Handler handler = new Handler(){  
    public void handleMessage(android.os.Message msg) {  
        switch (msg.what) {  
        case SHOW_IMAGES:  
            adapter = new MyAdapter();  
            listView.setAdapter(adapter);  
            break;  
        case NO_IMAGES:  
            Toast.makeText(MainActivity.this, "no images", Toast.LENGTH_LONG).show();  
            break;  
        case SHOW_IMAGE:  
            adapter.notifyDataSetChanged();  
            break;  
        default:  
            break;  
        }  
          
    };  
};  
 

 

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

 

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

 

 

摘自:http://www.iteye.com/topic/743672

 

你可能感兴趣的:(多线程,thread,android,OS,ITeye)