网络框架
用法
Volly:
RequestQueue mQueue;
mQueue= Volley.newRequestQueue(this);
StringRequest stringRequest = new StringRequest("", new Response.Listener<String>() {
@Override
public void onResponse(String response) {
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}
);
mQueue.add(stringRequest);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addInterceptor(null)
.cache(null)
.build();
OkHttp:
OkHttpClient mOkHttpClient = new OkHttpClient();
RequestBody formBody = new FormBody.Builder()
.add("size", "10")
.build();
Request mRequest = new Request.Builder()
.url("")
.post(formBody).build();
mOkHttpClient.newCall(mRequest).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, okhttp3.Response response) throws IOException {
}
});
Retrofit:
1、新建接口文件,写入网络请求方法如下:
public interface ITestService {
@POST("test/{id}")
Call<TestEntity> getData(@Path("id") int id);
}
如果有过java后台开发经验,这里类似于DAO层的接口及实现,很好理解。
2、Retrofit mRetrofit = new Retrofit.Builder()
.baseUrl("")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
ITestService mITestService = mRetrofit.create(ITestService.class);
final Call<TestEntity> mTestEntityCall = mITestService.getData(1);
3、mTestEntityCall.enqueue(new retrofit2.Callback<ResponseBody>() {
@Override
public void onResponse(retrofit2.Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {
}
@Override
public void onFailure(retrofit2.Call<ResponseBody> call, Throwable t) {
}
});
这里的mTestEntityCall实际上就是OkHttp中的RealCall,也可以使用execute方法,只是没有回掉。
Retrofit+Rxjava
这里会出现一个问题,就是
com.squareup.retrofit2:adapter-rxjava:2.3.0
会自动的导入rxjava,此时如果再导入RxAndroid和RxJava那么你会发现,在外部依赖中有3个版本的RXjava包,为什么呢?RxAndroid也会自动导入RXjava包,而且如果导入的包把本跨越比较大(如1.0到2.0),因为1.0和2.0版本的更改比较大,那么会让使用者非常困扰。正确的做法是
compile('com.squareup.retrofit2:adapter-rxjava:2.3.0') {
exclude module: 'rxjava'
}
// compile 'io.reactivex.rxjava2:rxjava:2.0.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
将adapter-rxjava中的包exclude掉,并且保证rxjava和rxandroid的版本一致,或者不导入rxjava,直接使用rxandroid依赖的rxjava。
1、修改接口文件如下,就是将Observable替换Call
public interface ITestService {
@POST("test/{id}")
Observable<TestEntity> getData(@Path("id") int id);
}
2、不需要使用enqueue和excued
io.reactivex.Observable<TestEntity> mObservable= mITestService.getData(1);
mObservable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<TestEntity>() {
@Override
}
@Override
public void onNext(TestEntity value) {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
volley
通过构建RequestQueue的时候,开始start线程,然后将网络请求add到PriorityBlockingQueue中,而NetworkDispatcher和CacheDispatcher两个线程则不断从队列中take相应的request执行。
okhttp
新建一个OkHttpClient对象(有两种方式),然后新建Request请求,调用newCall方法会返回一个Call(这里利用了向上转型,将RealCall转为Call,调用其中的execute和enqueue方法(区别是enqueue有CallBack有回掉),这里使用责任联模式,拦截Response;最后都会调用Dispatcher中的execute和enqueue,本质上都是调用ExecutorService.execute(),注意线程池中的核心线程数量为0,全部请求均为非核心线程,且闲置超时时长为60秒。
retofit
retrofit本质上是一个okhttp引入了动态代理和注解,使用注解将所有的网络获取分离到一个接口中,并且使用动态代理代理该接口。Retrofit采用的Builder设计模式,且构造器是protected限定符,不能直接创建Retrofit对象,必须使用内部类的build()方法。首先创建一个Retrofit对象,然后调用creat方法将Request以及网络请求和OkHttpCall关联起来,调用具体的请求方法(这里为mITestService.getData(1))将返回一个Call对象(OkHttpCall向上转型为Call),然后调用OkHttpCall的execute和enqueue方法,并且调用parseResponse解析结果。这是因为Callback接口的不同,Callback和Callback。
框架整合
retofit+rxjava
未完待续。