以前的项目都是用的很老的MVC来做的,当然我觉得MVC在维护方面是比MVP强的,网络请求框架是用的严大神的NoHttp,个人这个网络请求框架是非常nb的,有机会看到这博客的可以去GitHub上搜一下,非常好用。最近有点时间就开始去接触最近非常流行的Android开发组合RxJava+Retrofit+OkHttp3+Dagger2+MVP,因为刚上手,所以不是很熟,都是在学习别人的东西,基本上从别人的项目中剥离出来的,在这对那些高手表示感谢。
一、用RxJava+Retrofit+OkHttp3封装成网络请求框架:
1、OkHttp3工具类封装,在okhttp中设置缓存目录、请求拦截器,响应拦截器,代码如下:
public class OkHttpUtil {
private static OkHttpClient mOkHttpClient;
//设置缓存目录
private static final File cacheDirectory = new File(MyApplication.getMyApplication().getCacheDir().getAbsolutePath(), "httpCache");
private static Cache cache = new Cache(cacheDirectory, 10 * 1024 * 1024);
//请求拦截
private static RequestInterceptor requestInterceptor = new RequestInterceptor();
//响应拦截
private static ResponseInterceptor responseInterceptor = new ResponseInterceptor();
public static OkHttpClient getOkHttpClient() {
if (null == mOkHttpClient) {
mOkHttpClient = new OkHttpClient.Builder()
.cookieJar(CookieJar.NO_COOKIES)
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.addInterceptor(responseInterceptor)
.addInterceptor(new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
Log.i("http", message);
}
}).setLevel(HttpLoggingInterceptor.Level.BODY))
.cache(cache)
.build();
}
return mOkHttpClient;
}
}
在代码中有请求拦截器RequestInterceptor和响应拦截器ResponseInterceptor,一般的请求都需要带上请求头和一些公共的请求参数以及Cookie的管理,这些配置都是在请求拦截器中配置,而响应拦截器一般对返回的参数进行一定格式化,便于处理数据,具体见源码。这里还用okhttp中的日志拦截,这个非常厉害HttpLoggingInterceptor,可以打印出所有http请求的信息,再也不用跟你的后台小哥争论了,有详细日志有真相。
2、Retrofit工具类封装,Retrofit之所以牛逼是他可以跟RxJava完美的结合,无缝!!!具体代码如下
public abstract class RetrofitUtil {
//服务路径
private static final String Url = "http://hzqb.sftsdg.com/YMF_Webs/";
private static Retrofit mRetrofit;
private static OkHttpClient mOkHttpClient;
//获取Retrofit对象
protected static Retrofit getRetrofit(){
if (null == mRetrofit){
if (null == mOkHttpClient){
mOkHttpClient = OkHttpUtil.getOkHttpClient();
}
mRetrofit = new Retrofit.Builder()
.baseUrl(Url)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(mOkHttpClient)
.build();
}
return mRetrofit;
}
}
这里是将Retrofit与OkHttp完美结合,因为Retrofit需要传入一个Request Client,此时用OkHttp再合适不过了,同时,还可以用GsonConverterFactory来自动解析数据。需要注意的是,此处的url必须要以“/”结尾,不然会抛异常
3、获取将OkHttpClient和Retrofit结合好Retrofit对象,此处,Retrofit.create()返回一个泛型,完美结合RxJava,代码如下:
public class RequestEngine {
private static Retrofit mRetrofit;
//private static RequestEngine instance;
public RequestEngine() {
mRetrofit = RetrofitUtil.getRetrofit();
}
/*public static RequestEngine getInstance() {
if (instance == null) {
synchronized (RequestEngine.class) {
if (null == instance) {
instance = new RequestEngine();
}
}
}
return instance;
}*/
//返回一个泛型
public <T> T getServer(Class<T> server) {
return mRetrofit.create(server);
}
}
代码片中注释的是用一般的方法引入的封装好的Retrofit,此处把代码注释掉是因为用到了注解Dagger2,
4、用Retrofit写请求方法,返回的是Observable泛型,代码如下:
public interface RequestApi {
@FormUrlEncoded
@POST("login/u.php")
Observable<BaseBean<LoginInfo>> login(@Field("username") String username, @Field("password") String password, @Field("app") String type);
}
至于Retrofit一般用法还是挺简单的,简单介绍下,在retrofit中通过一个Java接口作为http请求的api接口
get请求:在方法上使用@Get注解来标志该方法为get请求,在方法中的参数需要用@Query来注释,如:
@GET("search/repositories")
Call<RetrofitBean> queryRetrofitByGetCall(@Query("q")String owner,
@Query("since")String time,
@Query("page")int page,
@Query</