(http://www.javaeye.com/topic/743672)
前几天记得说要分享一下异步下载加载图片的经验,最近一直在研究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张左右必报。坛子里也讨论了许久,没有结果,都是缩放图片或者避开这个大量图片的问题。我就采用的是避开大量图片的方法。过几天再写出来