六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 52|回复: 0

异步加载图片

[复制链接]

升级  40%

4

主题

4

主题

4

主题

童生

Rank: 1

积分
20
 楼主| 发表于 2013-1-15 02:23:49 | 显示全部楼层 |阅读模式
前几天记得说要分享一下异步下载加载图片的经验,最近一直在研究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{@Overridepublic 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;}@Overridepublic 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张左右必报。坛子里也讨论了许久,没有结果,都是缩放图片或者避开这个大量图片的问题。我就采用的是避开大量图片的方法。过几天再写出来
 
 
 
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表