网络框架解析

xiaoxiao2021-02-28  106

网络框架

用法

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

未完待续。

转载请注明原文地址: https://www.6miu.com/read-64585.html

最新回复(0)