三者关系:
Okhttp和retrofit是同一个开发公司开发的,而且retrofit就是依赖或者说就是为了Okhttp开发的,所以在项目中要想使用retrofit就必须同时引入Okhttp和retrofit两个库;
rxjava和前两个没有必然的联系,它是一个异步框架最大的优势就是他的异步和链式调用可以是代码层次清晰,因为以上两个优势所以受到欢迎;
因此在Android项目中会把他们三个组合在一起优势互补达到一个更好的效果(代码的可读性,网络方法的优化,代码效率的优化等等)。
写代码:
1.引入:
implementation("com.squareup.okhttp3:okhttp:3.12.0")
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation "io.reactivex.rxjava2:rxjava:2.2.3"
版本号最好根据你的需要换成最新的;
记得添加网络权限;
2.Retrofit的添加:
首先定义一个类RetrofitInstance,在这个类中添加方法内容如下
OkHttpClient.Builder builder = new OkHttpClient.Builder() .addInterceptor(new RequestInterceptors()) .addInterceptor(new ResponseInterceptors()) .connectTimeout(Constant.NET_CONNECT_TIMEOUT, TimeUnit.SECONDS) .readTimeout(Constant.NET_READ_TIMEOUT, TimeUnit.SECONDS) .writeTimeout(Constant.NET_WRITE_TIMEOUT, TimeUnit.SECONDS); OkHttpClient client = builder.build(); Retrofit.Builder retrofitBuilder = new Retrofit.Builder(); retrofitBuilder.baseUrl(BuildConfig.BASE_URL) .client(client) .addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io())) .addConverterFactory(GsonConverterFactory.create()) .addConverterFactory(StringConverterFactory.create()); retrofit = retrofitBuilder.build();
Retrofit是依赖OKhttp的所以要先初始化一个OKhttp的对象,其中addInterceptor()是添加拦截对象,在拦截对象中可以对访问和返回数据进行处理(其实可以在一个对象中完成但是为了逻辑更清晰所以分在了两个对象中,之后会介绍拦截);
设定几个时间限制,其中connectTimeout指的是链接超时的限制我们用的最多,readTimeout和writeTimeout分别是读取和写入超时,这个超时不是说读或写的时间过长,这两个值是说在读和写的过程中中断了的中断超时时间,以writeTimeout为例,在写入一个2M的数据时在写道1M的时候中断了,那最长等待时间就是writeTimeout,超过了这个设定的最长等待时间就算是超时了;
baseUrl是连接时的基础链接,调取接口的时候会自动把接口的路径和接口名字拼到这个链接后面;
client就是把okhttp绑定到retrofit上了;
addCallAdapterFactory绑定适配器,这里绑定了rxjava;
addConverterFactory实现对服务器返回数据的解析,converter需要自定义,GsonConverterFactory可以
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'通过引入来解析json的数据,同时我在这里自定义了一个String的converter,自定义converter很简单 class xxx implements Converter<ResponseBody, String> 就可以;
然后通过单例模式得到方法所在的对象来获取retrofit的对象;
3.调用
调用需要定义一个接口类,在这个接口类中定义接口方法;
public interface InterfaceClass{ @POST("xx/xxx/interfaceName") Observable<返回数据的接收对象> interfaceName(); }
这样我们就可以调用了,调用的方式是通过RetrofitInstance的单例模式获取retrofit,如语句一:
语句一:RetrofitInstance.retrofit.creat(InterfaceClass.class).interfaceName
其实还可以把上面这个语句简化但是这里为了说的明白一点这样了
这样语句一返回的就是一个Observable对象可以用rxjava来处理返回的数据了
RetrofitInstance.retrofit.creat(InterfaceClass.class).interfaceName.map().compose()等等
rxjava就不多说了,推荐一个https://www.jianshu.com/p/0cd258eecf60
这是最终我的引用
implementation 'com.squareup.okhttp3:okhttp:3.12.0' implementation 'com.squareup.retrofit2:retrofit:2.5.0' implementation 'io.reactivex.rxjava2:rxjava:2.2.3' implementation 'com.squareup.retrofit2:converter-gson:2.5.0' api 'com.trello.rxlifecycle2:rxlifecycle-components:2.2.1' api 'com.squareup.retrofit2:adapter-rxjava2:2.4.0' implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
版本号记得修改