Android网络加载图片

自定义ImageLoader类,方便调用里面写的Thread或异步任务下载图片
LruCache使用了最近最少使用算法

public class ImageLoader {
    private ImageView mImageView;
    private String mUrl;

    //创建cache
    private LruCache<String,Bitmap> mCaches;//需要缓存图像的名字

    public ImageLoader(){
        //获取最大可用内存
        int maxMerory=(int)Runtime.getRuntime().maxMemory();
        int cacheSize=maxMerory/4;
        //初始化mchache
        mCaches=new LruCache<String,Bitmap>(cacheSize){
            @Override
            protected int sizeOf(String key, Bitmap value) {
               //加载正确的内存大小,不然默认返回元素的个数
                //在每次存入缓存的时候调用
                return value.getByteCount();
            }
        };
    }
    //增加到缓存
    public void addBitmapToCache(String url,Bitmap bitmap){
        if(getBitmapFromCache(url)==null){//校验缓存中是否存在
            mCaches.put(url,bitmap);
        }

    }
    //从缓存中获取数据
    public Bitmap getBitmapFromCache(String url){
        return mCaches.get(url);
    }

    private Handler mHandler=new Handler() {
        @Override
        public void handleMessage(Message msg){
            super.handleMessage(msg);
            if(mImageView.getTag().equals(mUrl))//避免缓存的图片对正确的图片产生影响
                mImageView.setImageBitmap((Bitmap) msg.obj);
        }
    };

    //使用Thread方法下载
    public void showImageByThread(ImageView ImageView, final String url){
        mImageView=ImageView;
        mUrl=url;
        new Thread(){
            public void run(){
                super.run();
                Bitmap bitmap=getBitmapFromUrl(url);
                Message message= Message.obtain();
                message.obj=bitmap;
                mHandler.sendMessage(message);
            }

        }.start();
    }

    public Bitmap getBitmapFromUrl(String path){
        Bitmap bm=null;
        try{
            URL url=new URL(path);
            URLConnection connection=url.openConnection();
            connection.connect();
            InputStream inputStream=connection.getInputStream();
            bm= BitmapFactory.decodeStream(inputStream);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bm;
    }

    //使用异步任务下载
    public void showImageByAsyncTask(ImageView imageView,final String url){
        //判断缓存中是否存在该图片
        //从缓存中取出对应的图片
        Bitmap bitmap=getBitmapFromCache(url);
        //如果缓存中没有则去网上下载
        if(bitmap==null)
            new NewAsyncTask(imageView,url).execute(url);
        else
            imageView.setImageBitmap(bitmap);
        //new NewAsyncTask(imageView,url).execute(url);
    }

    private class NewAsyncTask extends AsyncTask<String,Void,Bitmap>{

        private ImageView mImageView;
        private String mUrl;

        public NewAsyncTask(ImageView imageView,String url) {
            mImageView=imageView;
            mUrl=url;
        }

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

        @Override
        protected Bitmap doInBackground(String... params) {
            //return getBitmapFromUrl(params[0]);//没有缓存机制的写法
            String url=params[0];
            //从网络获取图片
            Bitmap bitmap=getBitmapFromUrl(url);
            if(bitmap!=null)
                //将不在缓存的图片加入缓存
                addBitmapToCache(url,bitmap);
            return bitmap;
        }
    }
   }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值