使用HttpURLConnection和AsyncTask从网络缓存图片

1.创建NetCacheUtils中创建downloadBitmap(String url)方法

private Bitmap downloadBitmap(String url){
        HttpURLConnection conn=null;
        try {
            conn=(HttpURLConnection) new URL(url)
            .openConnection();
            
            conn.setConnectTimeout(5000);
            conn.setReadTimeout(5000);
            conn.setRequestMethod("GET");
            conn.connect();
            
            int responseCode = conn.getResponseCode();//响应码
            
            if(responseCode==200){//表示成功连接
                InputStream inputStream = conn.getInputStream();
                Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                return bitmap;
            }
            
        } catch (IOException e) {
            
            e.printStackTrace();
        }
        finally{
            conn.disconnect();
        }
        return null;
        
    }

 2.在NetCacheUtils中调用这个方法

public class NetCacheUtils {

    public void getBitmapFromNet(ImageView iv_photo, String url) {
        // TODO Auto-generated method stub
        BitmapTask bitmaptask=new BitmapTask();
        bitmaptask.execute(iv_photo,url);//开启AsyncTask,参数在doInBackground获取
    }
    /*AsyncTask  异步任务即做一些简单的异步处理  ;是handle与线程池的封装
     * 第一个泛型:参数类型泛型
     * 第二个泛型:更新进度泛型
     * 第三个泛型:onProgressUpdate的返回结果的泛型
     * 
     */
    
    class BitmapTask extends AsyncTask<Object, Void, Bitmap>{

        private ImageView pic;
        private String murl;
        /**
         * 后台耗时方法在此执行,子线程
         */
        @Override
        protected Bitmap doInBackground(Object... params) {
            pic = (ImageView) params[0];
            murl = (String) params[1];
            
            pic.setTag(murl);//将图片与url绑定
            return downloadBitmap(murl);
        }
        /**
         * 更新进度,主线程
         */
        @Override
        protected void onProgressUpdate(Void... values) {
            // TODO Auto-generated method stub
            super.onProgressUpdate(values);
        }
        /**
         * 后台耗时方法结束之后,在此执行,主线程
         */
        @Override
        protected void onPostExecute(Bitmap result) {
            if(result!=null){
                
                String tag = (String) pic.getTag();
                if(tag.equals(murl)){
                    pic.setImageBitmap(result);
                }
                
            }
            System.out.println("从网络上加载图片啦");
            
        }
    }

3.在MyBitMaputils类中调用NetCacheUtils类

public class MyBitMaputils {
    NetCacheUtils netcache;
    public MyBitMaputils(){
        netcache=new NetCacheUtils();
    }

    public void display(ImageView iv_photo, String url) {
        iv_photo.setImageResource(R.drawable.news_pic_default);//默认图片,防止图片的复用
        //内存缓存
        
        //本地缓存
        
        //网络缓存(第一次)
        netcache.getBitmapFromNet(iv_photo,url);
    }

    
}

4.就可以直接使用MyBitMaputils这个工具类了

原文地址:https://www.cnblogs.com/wangying222/p/5269378.html