网络框架解析

网络框架

用法

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

未完待续。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值