频道栏目
首页 > 程序开发 > 移动开发 > Android > 正文
Android网络加载图片实现方法
2017-12-20 14:25:18         来源:斯文败类  
收藏   我要投稿

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

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

    //创建cache
    private LruCache mCaches;//需要缓存图像的名字

    public ImageLoader(){
        //获取最大可用内存
        int maxMerory=(int)Runtime.getRuntime().maxMemory();
        int cacheSize=maxMerory/4;
        //初始化mchache
        mCaches=new LruCache(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{

        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;
        }
    }
   }
点击复制链接 与好友分享!回本站首页
上一篇:Android四大组件Servier(上)
下一篇:《Android 学习笔记》在Android studio中导入Eclipse项目 gradle 版本不对的问题
相关文章
图文推荐
文章
推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站