Android多线程ListView加载并缓冲图片

49 阅读1分钟

参考视频,慕课网视频给出了使用AsyncTask缓冲图片的方法,将ImageLoader作为成员变量后,内存成功的作为一份,但getView屡次对传递过去的参数初始化,造成图片的判断条件失效,即下代码:

if(imageView.getTag().equals(url)){
    //其他操作
}

修改后的加载图片的代码如下:

//导包等···
public class ImageLoader {

    private LruCache<String,Bitmap> lruCache;

    public ImageLoader() {
        long maxMemory=Runtime.getRuntime().maxMemory();
        long cacheSize=maxMemory/4;
        lruCache=new LruCache<String, Bitmap>((int) cacheSize){
            @Override
            protected int sizeOf(String key, Bitmap value) {
                return value.getByteCount();
            }
        };
    }
    public void addBitmapToCache(String url,Bitmap bitmap){
        if(getBitmapFromCache(url)==null){
            lruCache.put(url,bitmap);
        }
    }
    public Bitmap getBitmapFromCache(String url){
        return lruCache.get(url);
    }
    public void showImageByThread(final ImageView imageView, final String url){
        Bitmap b = getBitmapFromCache(url);
        final Handler handle=new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                if(imageView.getTag().equals(url)) {
                    Bitmap bitmap= (Bitmap) msg.obj;
                    imageView.setImageBitmap(bitmap);
                    addBitmapToCache(url,bitmap);
                }
            }
        };
        if(b ==null){
            new Thread(){
                @Override
                public void run() {
                    super.run();
                    Message message=Message.obtain();
                    message.obj=getBitmapFromURL(url);
                    handle.sendMessage(message);
                }
            }.start();
        }else{
            imageView.setImageBitmap(b);
        }

    }
    Bitmap getBitmapFromURL(String url){
        Bitmap bitmap=null;
        try {
            bitmap=BitmapFactory.decodeStream(new URL(url).openStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return  bitmap;
    }
    //第二种方法
    public void showImageByAsyncTask(ImageView imageView,String url){
        Bitmap b=getBitmapFromCache(url);
        if(b==null){
            new NewsAsyncTask(imageView,url).execute(url);
        }else{
            imageView.setImageBitmap(b);
        }

    }
    class NewsAsyncTask extends AsyncTask<String,Void,Bitmap>{
        private ImageView imageView;
        private String url;

        public NewsAsyncTask(ImageView imageView,String url) {
            this.imageView = imageView;
            this.url=url;
        }

        @Override
        protected Bitmap doInBackground(String... params) {
            Bitmap bitmapFromURL = getBitmapFromURL(params[0]);
            if(bitmapFromURL!=null)
                addBitmapToCache(url,bitmapFromURL);
            return bitmapFromURL;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
            if(imageView.getTag().equals(url)){
                imageView.setImageBitmap(bitmap);
            }
        }
    }
}

效果如下:
这里写图片描述


需要源码的留言,不懂得我也可以帮你查!~0~