RxJava的初学随笔(二)

来源:互联网 发布:淘宝店代运营可靠吗 编辑:程序博客网 时间:2024/06/05 11:57

~


一、关于Retrofit初始化

Retrofit1.0和Retrofit2.0在初始化上有一些细微的变化,我们先来看下代码

 Retrofit1.0

public static CustomApiInterface getCustomApiClient(Class<?> mClass, boolean isCache) {    RestAdapter restAdapter = new RestAdapter.Builder()            .setErrorHandler(retrofitErrorHandler)            .setEndpoint(URLs.ROOT_URL)            .setRequestInterceptor(requestInterceptor)            .setConverter(new ApiConverter(mClass))                    // 是否缓存本次请求            .setClient(new CachingClient(isCache))            .build();    
    mServiceApi = restAdapter.create(CustomApiInterface.class);
return customApiInterface;
     



   Retrofit2.0

@Injectpublic RestDataSource() {    HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();    loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);    OkHttpClient client = new OkHttpClient().newBuilder().addInterceptor(loggingInterceptor).build();    Retrofit AdapterApi = new Retrofit.Builder().baseUrl(ServiceApi.END_POINT)            .addConverterFactory(GsonConverterFactory.create())            .addCallAdapterFactory(RxJavaCallAdapterFactory.create()).client(client)            .build();    mServiceApi = AdapterApi.create(ServiceApi.class);}

1.可以明显的看到在Retrofit1.0中RestAdapter到2.0中名称直接改为Retrofit,这样从名称来看显得更直观了。

2.1.0中setEndponit到2.0改为baseUrl。

3.设置Interceptro(拦截器)这点改动比较大,在1.0中是直接设置的,而在2.0中需要先设置网络客户端,然后在网络客户端中设置Interceptro。这点改动主要原因是,1.0的时候
   Retrofit可以设置其他网络客户端,而到了2.0直接将okhttp设置为默认网络客户端,所以设置拦截器的步骤就在okhttp中了。
4.addCallAdapterFactory(RxJavaCallAdapterFactory.create())表示支持RxJava。
二、关于RxJava的Schedulers(调度器)
      我们知道Rxjava引入了Schedulers的概念,通过Schedulers可以调度线程,这样大大方便了我们多线程开发。比如我们用Retrofit+Rxjava生成一个网络接口时,可以这样做
    
@Overridepublic Observable<BannerWrapper> execute() {    return mRepository.getBanners(mType).subscribeOn(Schedulers.io())            .observeOn(AndroidSchedulers.mainThread());}

可以从代码中看出,出现了这两个方法subscribeOn(Schedulers.io) 、observeOn(AndroidSchedulers.mainThread())。第一个方法表示被观察者在产生信息时所在的线程,第二个方法表示订阅者在订阅后消费信息时所在的线程。这两个方法就是Rxjava的最基本线程调度功能,请求数据的时候在io线程,数据请求成功后在AndroidUi线程更新界面,这样是不是比起以前的开启一个新线程请求接口,然后写一个回调到ui线程的接口方便很多呢。
  然后在实际使用中还是有些小细节需要处理,比如在请求网络接口时,在准备阶段我们会show一个Progress表示网络等待,但是使用subscribeOn(Schedulers.io())后把整个准备阶段都纳入了io线程,但是我们showProgerss需要在UI线程,如果直接showProgerss会导致线程非法,所以这里需要用到Observable.doOnSubscribe(),doOnSubscribe()中的动作执行在subscribe()发生的线程中,而如果doOnSubscribe()之后又subscribeOn()的话,doOnSubscribe将执行在离它最近的subscribeOn()指定的线程中,所以我们可以这样改动一下代码。
  
 @Override    public Observable<BannerWrapper> execute() {        return mRepository.getBanners(mType).subscribeOn(Schedulers.io()).doOnSubscribe(new Action0() {            @Override            public void call() {//                showProgerss();            }        }).subscribeOn(AndroidSchedulers.mainThread())                .observeOn(AndroidSchedulers.mainThread());    }
  
  至此就达到了在准备阶段showProgerss的功能。

0 0