好了,今天就通过一个瀑布流demo,来使用Volley框架请求网络图片。

前言:

我们使用NetworkImageView显示图片:

1、因为该控件可以自动的管理好请求的生命周期,当与父控件detach或者它移出屏幕时可以自动取消网络请求

2、该控件会根据我们所设置的NetworkImageView宽高来进行图片的压缩

3、该控件可以设置默认状态下显示的图片,可以设置在请求失败时候显示的图片

还用了ImageLoader来加载图片,使用ImageCache缓存来防止程序OOM,由于Volley自动会处理硬盘缓存,所以在没网情况下它还是能正常显示图片


好了,我先来看看效果吧:

由于gif上传大小限制,我就录了前一部分,我们从这部分的效果就可以看出,在加载图片时候,默认时会先显示我们设置的默认的图片,然后通过网络加载,再显示加载到的图片,因为ImageCache自动管理了内存缓存、而NetworkImageView又自动会根据它自身的宽高来压缩图片,所以即使图片数量多、图片大小比较大也可以很好的避免OOM。

下面我们打开缓存目录来看下缓存的文件:

现在我们把网络断开,来看看效果:

可以看到,在没有网络状态下,还是可以加载出图片,因为它会从缓存中取,即:

在没有网络的条件下会自动从缓存中取数据,在有网络的状态下,会先判断缓存中有没有该缓存文件,如有则取出,没有则开启网络请求获取,再存入硬盘缓存中。

好了,代码就贴个主要的:

RecyclerView适配器:

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerViewHolder> {
    private Context mContext;
    private List<String> datas;
    private ImageLoader mImageLoader;
    private BitmapCache mBitmapCache;
    private List<Integer> heights;

    public RecyclerAdapter(Context context, List<String> datas) {
        this.mContext = context;
        this.datas = datas;
        getRandomHeights();
        mBitmapCache = new BitmapCache();
        mImageLoader = new ImageLoader(MyApplication.getRequestQueue(), mBitmapCache);
    }

    private void getRandomHeights() {
        heights = new ArrayList<>();
        for (int i = 0; i < datas.size(); i++) {
            heights.add((int) (300 + Math.random() * 200));
        }
    }

    @Override
    public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.layout_item, parent, false);
        RecyclerViewHolder holder = new RecyclerViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(RecyclerViewHolder holder, int position) {
        ViewGroup.LayoutParams params = holder.itemView.getLayoutParams();
        params.height = heights.get(position);
        holder.itemView.setLayoutParams(params);

        holder.mNetworkImageView.setDefaultImageResId(R.mipmap.ic_crop_original_black_48dp);
        holder.mNetworkImageView.setErrorImageResId(R.mipmap.ic_filter_hdr_black_48dp);
        holder.mNetworkImageView.setImageUrl(datas.get(position), mImageLoader);
    }

    @Override
    public int getItemCount() {
        return datas.size();
    }
}

BitmapCache代码:

public class BitmapCache implements ImageLoader.ImageCache {
    private LruCache<String,Bitmap> mLruCache;
    public BitmapCache(){
        int maxMemory = (int) Runtime.getRuntime().maxMemory();
        int maxCacheSize = maxMemory/8;
        mLruCache = new LruCache<String,Bitmap>(maxCacheSize){
            @Override
            protected int sizeOf(String key, Bitmap value) {
                return value.getByteCount();
            }
        };
    }
    @Override
    public Bitmap getBitmap(String s) {
        return mLruCache.get(s);
    }

    @Override
    public void putBitmap(String s, Bitmap bitmap) {
        mLruCache.put(s,bitmap);
    }
}

demo下载地址请戳

Volley网络框架完全解析(实战篇)的更多相关文章

  1. Volley网络框架完全解析(缓存篇)

    在上一篇中讲完了Volley框架怎么使用,那么这篇就来讲讲Volley框架的缓存机制 我们看Volley内部源码发现: Volley框架内部自己处理了DiskBasedCache硬盘缓存,但是没有处理 ...

  2. Volley网络框架完全解析(使用篇)

    在Android中,网络请求无非就这两种:HttpURLConnection和HttpClient( Apache),我们在使用时一般都会对它们进行一系列的封装,但是这过程不免有些繁琐,所以,Goog ...

  3. 谷歌Volley网络框架讲解——BasicNetwork类

    谷歌Volley网络框架讲解——BasicNetwork类 这个类是toolbox工具箱包里的,实现了Network接口. 先来看下Network这个interface,performRequest( ...

  4. 谷歌Volley网络框架讲解——第一篇

    自从公司新招了几个android工程师后,我清闲了些许.于是就可以有时间写写博客,研究一些没来的研究的东西. 今年的谷歌IO大会上,谷歌推出了自己的网络框架——Volley.不久前就听说了但是没有cl ...

  5. Volley网络框架的使用

    Volley的特点:   使用网络通信更快.更简单 Get/Post网络请求网络图像的高效率异步请求 可以对网络请求的优先级进行排序处理 可以进行网络请求的缓存 可以取消多级别请求 可以和Activi ...

  6. 谷歌Volley网络框架讲解——HttpStack及其实现类

    前两篇已经对网络请求流程已经梳理了个大概,这次我们着重看一下HttpStack和它的其实现类.我们之前在Network篇讲过它仅有一个实现类,而今天我们讲的HttpStack有两个实现类. 其中Htt ...

  7. 谷歌Volley网络框架讲解——网络枢纽

    研究了这么久的Volley,愈来愈发现这个框架的精美和人性化.比起民间一些框架强很多,一开始总是盲人摸象找不到头绪,现在终于有些明朗了.Volley其实就是一个请求队列的代理类,我们看下UML. 这就 ...

  8. 谷歌Volley网络框架讲解——Network及其实现类

    我们看到Network接口只有一个实现类BasicNetwork,而HttpStack有两个实现类. BasicNetwork这个类是toolbox工具箱包里的,实现了Network接口. 先来看下N ...

  9. Android网络框架Volley(实战篇)

      之前讲了ym—— Android网络框架Volley(体验篇),大家应该了解了volley的使用,接下来我们要看看如何把volley使用到实战项目里面,我们先考虑下一些问题: 从上一篇来看 mQu ...

随机推荐

  1. Redis 学习笔记2:redis.conf配置文件详解

    Redis 的配置文件位于 Redis 安装目录下,文件名为 redis.conf. 参数说明: 参数说明 redis.conf 配置项说明如下: 1. Redis默认不是以守护进程的方式运行,可以通 ...

  2. JAVA对象及属性的内存堆栈管理(通过小程序简单说明)

    JAVA在执行过程中会划分4个内存区域(heap.stack.data segment.code segment)代码区(codesegment):java开始执行会把代码加载到code segmen ...

  3. Retrofit 2.0 超能实践(一),okHttp完美支持Https传输

    http: //blog.csdn.net/sk719887916/article/details/51597816 Tamic首发 前阵子看到圈子里Retrofit 2.0,RxJava(Andro ...

  4. EBS中的采购单据状态及其控制

     李  颖 (济南钢铁股份有限公司 装备部,山东 济南 250101) 摘 要:介绍了Oracle Purchasing模块中采购单据的管理与控制,结合实例,分析了各状态下可采取的控制活动及控制活 ...

  5. 3. React 组件生命周期介绍

            React 中的每个组件都有三个阶段,这三个阶段构成了组件完整的生命周期.组件的生命周期为]); return; } this.setState({name: event.target ...

  6. (八十一)利用系统自带App来实现导航

    利用系统的地图App进行导航,只需要传入起点和终点.启动参数,调用MKMapItem的类方法openMapWithItems:launchOptions:来实现定位,调用此方法后会打开系统的地图App ...

  7. Linux下jetty报java.lang.OutOfMemoryError: PermGen space及Jetty内存配置调优解决方案

    Linux下的jetty报java.lang.OutOfMemoryError: PermGen space及Jetty内存配置调优解决方案问题linux的jetty下发布程序后再启动jetty服务时 ...

  8. 《java入门第一季》之集合框架TreeSet存储元素自然排序以及图解

    这一篇对TreeSet做介绍,先看一个简单的例子: * TreeSet:能够对元素按照某种规则进行排序.  * 排序有两种方式  * A:自然排序: 从小到大排序  * B:比较器排序    Comp ...

  9. Android必知必会-Handler可能引起的内存泄露

    在Android开发中,编写多线程通常会使用到Thread和Handler,细心的朋友会发现,很常见的写法会被编辑器提示有问题,new Handler(){} 内的代码背景颜色会变成黄色.Androi ...

  10. (一)php的基本知识和一些注意点

    注意:任何程序,包括php,在运行时都在内存中进行,php代码需要被读取到内存中才能执行. [php的运行方式] 1.通过服务器(例如apache)调用. 2.通过命令行调用(不需要服务器参与,因为没 ...