java实现封装第3步_RxJava+Retrofit+OkHttp,一步一步封装网络框架;

使用RxJava+Retrofit+OkHttp,首先在build.gradle添加:

compile 'com.squareup.okhttp3:okhttp:3.8.1'

compile 'com.squareup.retrofit2:retrofit:2.3.0'

compile 'com.squareup.retrofit2:converter-gson:2.3.0'

compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'

compile "io.reactivex.rxjava2:rxjava:2.1.2"

implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'

implementation 'com.orhanobut:logger:2.2.0'

compile "com.squareup.okhttp3:logging-interceptor:3.8.1"

一、Retrofit网络库的使用;

1、创建retrofit的实例:

Retrofit retrofit= new Retrofit.Builder()

.baseUrl("https://movie.douban.com")

.addConverterFactory(GsonConverterFactory.create())

.build();

2、创建一个接口,里面放的是网络请求的Url;

public interface DouBanApi {

// http://api.douban.com/v2/movie/top250?start=25&count=25

@GET("v2/movie/top250")

Call getcTop250(@Query("start") int start, @Query("count") int count);

}

3、使用retrofit请求网络:

DouBanApi urlAPI = retrofit.create(DouBanApi.class);

urlAPI.getcTop250(0,20).enqueue(new Callback() {

@Override

public void onResponse(Call call, Response response) {

}

@Override

public void onFailure(Call call, Throwable t) {

}

});

它这个请求完成后,自动把请求的结果转换成了Json数据;请求的结果太多了我就不写了;

二、Retrofit配合RxJava使用;

1、接口中的Api返回类型我们给它改为RxJava的被观察者;

public interface DouBanApi {

// http://api.douban.com/v2/movie/top250?start=25&count=25

@GET("v2/movie/top250")

Observable getTop250(@Query("start") int start,@Query("count") int count);

}

2、Retrofit+RxJava请求网络:

private void RxjavaandRetrofit(){

new Retrofit.Builder()

.baseUrl("https://movie.douban.com")

.addConverterFactory(GsonConverterFactory.create())

.addCallAdapterFactory(RxJava2CallAdapterFactory.create())

.build()

.create(DouBanApi.class)

.getTop250(0,20)

.subscribeOn(Schedulers.io()) //被观察者 开子线程请求网络

.observeOn(AndroidSchedulers.mainThread()) //观察者 切换到主线程

.subscribe(new Observer() {

@Override

public void onSubscribe(Disposable d) {

}

@Override

public void onNext(JsonObject jsonObject) {

}

@Override

public void onError(Throwable e) {

}

@Override

public void onComplete() {

}

});

}

这样就完成了RxJava+Retrofit请求网络;

三:添加OkHttp配置;

okhttp可以设置很多的东西,请求头、拦截器、Log打印、请求超时时间......(最主要的okhttp的速度比Retrofit快很多);

OkHttpClient.Builder builder = new OkHttpClient.Builder()

.connectTimeout(30, TimeUnit.SECONDS)

.readTimeout(30,TimeUnit.SECONDS)

.writeTimeout(30,TimeUnit.SECONDS)

.addInterceptor(new Interceptor() {

@Override

public Response intercept(Chain chain) throws IOException {

Request.Builder request = chain.request().newBuilder();

request.addHeader("Accept","*/*");

//添加拦截器

return chain.proceed(request.build());

}

});

HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {

@Override

public void log(String message) {

Logger.i(message);

}

}).setLevel(HttpLoggingInterceptor.Level.BODY);

builder.addInterceptor(loggingInterceptor);

Retrofit.Builder retrofit= new Retrofit.Builder()

.baseUrl("https://movie.douban.com")

.addConverterFactory(GsonConverterFactory.create());

retrofit.client(builder.build()).build();

这样Retrofit的网络请求就会使用OkHttp的内核了;

四、RxJava+Retrofit+OkHttp封装;

作为一个聪明的程序猿,不!作为一个聪明的攻城狮,我们每次请求不可能都写这么多的代码;来封装一下:

public class RetrofitUtils {

/*

http://api.douban.com/

*/

private String baseUrl = "http://api.douban.com/";

private static final RetrofitUtils retrofitUtils = new RetrofitUtils();

public static RetrofitUtils get(){

return retrofitUtils;

}

private static volatile Retrofit retrofit;

public RetrofitUtils(){

Retrofit.Builder retrofitBuilder = new Retrofit.Builder()

.baseUrl(baseUrl)

.addConverterFactory(GsonConverterFactory.create())

.addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io()));

OkHttpClient.Builder builder = new OkHttpClient.Builder()

.connectTimeout(30, TimeUnit.SECONDS)

.readTimeout(30,TimeUnit.SECONDS)

.writeTimeout(30,TimeUnit.SECONDS)

.addInterceptor(new Interceptor() {

@Override

public Response intercept(Chain chain) throws IOException {

Request.Builder request = chain.request().newBuilder();

request.addHeader("Accept","*/*");

//添加拦截器

return chain.proceed(request.build());

}

});

HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {

@Override

public void log(String message) {

Logger.i(message);

}

}).setLevel(HttpLoggingInterceptor.Level.BODY);

builder.addInterceptor(loggingInterceptor);

retrofit = retrofitBuilder.client(builder.build()).build();

}

public static T create(Class cls) {

return retrofit.create(cls);

}

}

如何使用呢?

private void doubanTest() {

RetrofitUtils.get().create(DouBanApi.class)

.getTop250(0,5)

.subscribe(new Consumer() {

@Override

public void accept(JsonObject jsonObject) throws Exception {

//正常请求成功

}

}, new Consumer() {

@Override

public void accept(Throwable throwable) throws Exception {

//请求异常时

}

});

}

简单不简单,还有谁!!!

其实,我们可以发现,RxJava+Retrofit+OkHttp它们3个的配合使用:

RxJava主要是用来实现线程的切换的。我们可以在指定订阅的在哪个线程,观察在哪个线程。我们可以通过操作符进行数据变换。整个过程都是链式的,简化逻辑;

Retrofit就是网络请求的一个架子,用它设置一些参数和请求的URL之类的;

OkHttp是网络请求的内核,实际的网络请求是它发出来的;


版权声明:本文为weixin_30332669原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。