public class RetrofitConf {
private static final String BASEURL = “http:// xxxxx”;
private static String token;
private Retrofit retrofit;
private LpyService service;
private Boolean isDebug = true;
//创建网络请求
public RetrofitConf() {
OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder();
if (isDebug) {
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
clientBuilder.addInterceptor(loggingInterceptor);
}
clientBuilder.addInterceptor(chain -> {
Request request = chain.request();
Request.Builder builder = request.newBuilder();
builder.addHeader(“client”, “android”);
if (token != null ) {
builder.addHeader(“token”, token);
}
return chain.proceed(builder.build());
});
//创建网络请求
retrofit = new Retrofit.Builder()
.baseUrl(BASEURL) //对应服务器host
.addConverterFactory(GsonConverterFactory.create()) //Gson解析
// 把Retrofit请求转化成RxJava的Observable.addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io()))
.client(clientBuilder.build())
.build();
service = retrofit.create(LpyService.class);
}
public static void setToken(String token) {
RetrofitConf.token = token;
}
//引用接口类
LpyService getService() {
return service;
}
}
需要注意的是,只有在调用Observable的subscribe方法时,网络请求才会触发,订阅即触发。
如果在请求过程中,UI层destroy了怎么办,不及时取消订阅,可能会造成内存泄漏。因此,CompositeDisposable就上场了,它可以对我们订阅的请求进行统一管理。
大致三步走:
1、在UI层创建的时候(比如onCreate之类的),实例化CompositeDisposable;
2、把subscribe订阅返回的Disposable对象加入管理器;
3、UI销毁时清空订阅的对象
这样我们就可以管理脱缰的网络请求了,相当于将它与UI的生命周期绑定。只要稍稍将上述模板封装一哈,就比较方便了。比如add操作可以封装一个方法,每次网络请求时add一发就好。
对于MVP架构的项目,CompositeDisposable完全可以封装到Presenter当中。这里就不展开了。
变换操作符
1.Map()
map操作符把被观察者Observable产生的结果通过映射规则转换成另一种结果集,并交给订阅者处理。简单来说就是对被观察者发送的每个事件都通过指定函数的处理,从而转变成另一种事件。
上面的例子中我们使用just()操作符连续发送1,2,3,4,5等5个事件,通过Map操作符中的Function函数对被观察者发送的事件统一作出乘以10处理,订阅后输出最终结果: