Android Volley + OkHttp3 + Gson 开源库的封装
前言
博客将按照下面的步骤介绍Volley的重新封装:
1.OkHttp3的关于Volley的HttpStack实现
2.HttpRequest的实现和HttpListener回调监听的封装
3.Volley原始的Request的Wrap
4.各种方式的请求的重新实现
5.统一请求的实现
6.使用
所需依赖:
1 | compile 'com.android.volley:volley:1.0.0' |
OkHttp3Stack的关于Volley的实现
这个是应该是比较简单的,关于OkHttp3Stack的实现在github上面有实现,本博客里面的实现在我的Github上面。
由于代码比较长,而且这个也不是这篇博客的重点,大家需要的话可以去我的Github查看。
HttpRequest的实现和HttpListener回调监听的封装
HttpRequest的实现
通过查看Volley的源代码我们会发现,Volley的Request的构造方法是这样写的:
1 | public Request(int method, String url, Response.ErrorListener listener) { |
请求的参数有一些通过构造方法传递,而另外一些参数是通过Request里面的很多的get方法得到的,比如post请求的时候的参数是通过Request类里面的getParams()实现的,而我们需要做的就是如果需要post请求,那么就重写请求类,覆盖里面的getParams方法。
1 | protected Map<String, String> getParams() throws AuthFailureError { |
会发现这样并不利于统一的调度,那其实在构造一个请求的时候,参数是不固定的,而且有的需要,有的不需要,这个时候,我们可以通过Builder模式来构造请求,可以进行如下的封装。
1 | package com.yong.volleyok; |
我们构造这样的一个请求的类,然后在请求的时候可以通过这个类,去构建请求的时候需要的一些参数。这个类很简单就不用详细的讲解了。具体的怎么使用这个类去构造请求,我们会在Wrap Volley的Request的时候详细的说明。
HttpListener的封装
其实就是回调的封装,在Volley里面是使用了两个接口来做的,这里统一成一个接口。
1 | package com.yong.volleyok; |
将成功和失败的回调封装到一个方法里面了。
Request的Wrap
为了以后能更好的升级的考虑,我们最好是不采用直接改源代码的方式,所以我们只能对原始的请求类Request类进行Wrap,然后我们自定义请求类继承这个Wrap的类。先贴代码,然后讲解。
1 | package com.yong.volleyok.request; |
这里最重要的就是这个类了,下面详细的说一下,封装的过程:
我们在前面定义了HttpRequest和HttpListener类就是为了在这里使用,在构造方法里面把这两个传递进来,然后请求需要的参数通过HttpRequest的一系列的get方法获取,请求最终的回调通过HttpListener传递出去。
首先来看HttpListener的最终的两个回调的方法:
1 |
|
这两个方法一个是请求成功的方法,另外一个是请求失败的方法,我们通过HttpListener把最后的结果抛出去,这里可以统一实现,不需要子请求类再去实现了。
再看其余的一些方法,getUrl方法是请求的url,但是我们在封装请求的时候不管是get还是post都是把参数放置getParams方法里面返回的,get请求是直接使用url拼接参数的,所以需要对这个方法进行重写,这样,才能保证get请求能有参数。
getHeaders是请求头,这里直接使用HttpRequest获取到。
getParams时请求的参数,也是直接通过HttpRequest拿到。
其余的方法都是大同小异,总体来说这个封装也比较简单的。
各种方式的请求的重新实现
上面对Request进行了重新的封装之后,我们只需要继承RequestWrapper即可,并且,需要我们实现的方法也只有一个了,parseNetworkResponse。由于我们队Request进行了封装,所以Volley自己带的几个请求,如JsonRequest,StringRequest等,都需要重写,继承RequestWrapper,但是,经过我们的封装,重写不会很麻烦。
这里只举两个例子,一个ByteRequest:
1 | package com.yong.volleyok.request; |
可以看到经过我们的封装之后,实现变得非常简单了。
GsonRequest:
1 | package com.yong.volleyok.request; |
这里只贴出这两个方法,还有的方法可以看Github。
统一请求的实现
请求都封装好了,现在只有调用了,针对封装的6种请求可以封装一个接口。
1 | package com.yong.volleyok; |
然后再写一个具体的实现类即可。
1 | package com.yong.volleyok; |
使用方式
当然使用也非常简单,看HttpClient就知道有哪些方法。
1 | mResult = (TextView) findViewById(R.id.result); |