现在android网络请求大部分已经换成了Retrofit2.0+RxJava+okHttp3.0,Retrofit 使用接口的方式,负责请求的数据和请求的结果,OkHttp 负责请求的过程,RxJava 负责异步,各种线程之间的切换。毫无疑问这三剑客 已成为当前Android 网络请求最流行的方式。
Retrofit: Retrofit是Square 公司开发的一款正对Android 网络请求的框架。底层基于OkHttp 实现,OkHttp 已经得到了google 官方的认可。Retrofit官网
OkHttp: 也是Square 开源的网络请求库
RxJava:RxJava 在 GitHub 主页上的自我介绍是 “a library for composing asynchronous and event-based programs using observable sequences for the Java VM”(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)。这就是 RxJava ,概括得非常精准。总之就是让异步操作变得非常简单。
Retrofit 负责请求的数据和请求的结果,使用接口的方式呈现,OkHttp 负责请求的过程,RxJava 负责异步,各种线程之间的切换。
配合rxjava使用
1.要使用Retrofit ,你肯定需要把它的包引入,在你的build.gradle文件中添加如下配置:
implementation 'com.google.code.gson:gson:2.8.2'//gson解析
compile 'com.squareup.retrofit2:retrofit:2.0.2'//retrofit2.0
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'//配合Rxjava 使用
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'//ConverterFactory的Gson:
compile 'io.reactivex.rxjava2:rxjava:2.1.8'//rxjava
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'//日志拦截器
Retrofit官网上也有具体的用法的讲解,在这我就不献丑了!
Retrofit用法详解
2, 更改定义的接口,返回值不再是一个Call ,而是返回的一个Observble.
//请求接口根地址
public class Constant {
public static String NewsUrl = "http://v.juhe.cn/";
public static String AndroidNews = "http://gank.io/";
}
/**
* Author:AND
* Time:2018/2/27.
* Email:[email protected]
* Description:
* Detail:
*/
public interface Request_Interface {
@GET("toutiao/index?type=top&key=597b4f9dcb50e051fd725a9ec54d6653")
Observable getNewsData();
@GET("api/data/Android/10/{page}")
Observable getAndroidNewsData(@Path("page") String page);
}
3,Activity 或者 Fragment 中传入 Subscriber 建立订阅关系
//获取retrofit对象
Request_Interface request_interface = RetrofitManager.getInstance(url).setCreate(Request_Interface.class);
//封装请求方法
Observable newsData = request_interface.getNewsData();
//开始请求
newsData.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(NewsBean newsBean) {
//数据已经请求完毕
}
@Override
public void onError(Throwable e) {
Log.e(TAG, e.toString());
}
@Override
public void onComplete() {
}
});
4,retrofit的封装
public class RetrofitManager {
private Retrofit mRetrofit;
private String baseUrl;
private static RetrofitManager mRetrofitManager;
public static OkHttpClient okHttpClient;
//静态块,获取OkHttpClient对象
static {
getOkHttpClient();
}
private RetrofitManager(String baseUrl) {
this.baseUrl = baseUrl;
initRetrofit();
}
public static synchronized RetrofitManager getInstance(String baseUrl) {
if (mRetrofitManager == null) {
synchronized (RetrofitManager.class) {
if (mRetrofitManager == null) {
mRetrofitManager = new RetrofitManager(baseUrl);
}
}
}
return mRetrofitManager;
}
//单例模式获取okhttp
public static OkHttpClient getOkHttpClient() {
if (okHttpClient == null) {
synchronized (OkHttpClient.class) {
if (okHttpClient == null) {
okHttpClient = new OkHttpClient.Builder()
//打印拦截器日志
.addNetworkInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
.connectTimeout(15, TimeUnit.SECONDS)//设置连接超时时间
.readTimeout(15, TimeUnit.SECONDS)//设置读取超时时间
.writeTimeout(15, TimeUnit.SECONDS)//设置写入超时时间
.build();
}
}
}
return okHttpClient;
}
private void initRetrofit() {
mRetrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(okHttpClient)
.build();
}
/**
* 创建相应的服务接口
*/
public T setCreate(Class reqServer) {
return mRetrofit.create(reqServer);
}
}
以上是加入RxJava 后的网络请求,返回不再是一个Call ,而是一个Observable, 在Activity / Fragment 中传入一个Subscriber 建立订阅关系,就可以在 onNext 中处理结果了,RxJava 的好处是帮我处理线程之间的切换,我们可以在指定订阅的在哪个线程,观察在哪个线程。我们可以通过操作符进行数据变换。整个过程都是链式的,简化逻辑。其中FlatMap 操作符 还可以解除多层嵌套的问题。总之,RxJava 很强大,能帮我处理很多复杂的场景,如果熟练使用的话,那么能提升我们的开发效率。
5,加入Okhttp的具体配置
通过OkHttpClient 可以配置很多东西,比如链接超时时间,缓存,拦截器等等。代码如下:
// 创建 OKHttpClient
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.connectTimeout(DEFAULT_TIME_OUT, TimeUnit.SECONDS);//连接超时时间
builder.writeTimeout(DEFAULT_TIME_OUT, TimeUnit.SECONDS);//写操作 超时时间
builder.readTimeout(DEFAULT_TIME_OUT, TimeUnit.SECONDS);//读操作超时时间
// 添加公共参数拦截器
BasicParamsInterceptor basicParamsInterceptor = new BasicParamsInterceptor.Builder()
.addHeaderParam("userName", "")//添加公共参数
.addHeaderParam("device", "")
.build();
builder.addInterceptor(basicParamsInterceptor);
// 创建Retrofit
mRetrofit = new Retrofit.Builder()
.client(builder.build())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(ApiConfig.BASE_URL)
.build();
连接超时时间,实际项目中,我们可能有一些公共的参数,如 ,设备信息,渠道,Token 之类的,每个接口都需要用,我们可以写一个拦截器,然后配置到OKHttpClient里,通过 builder.addInterceptor(basicParamsInterceptor) 添加,这样我们就不用每个接口都添加这些参数了。
Retrofit+Rxjava+OkHttp封装参考篇幅