RxJava的初学随笔(二)

本文对比了Retrofit 1.0与2.0在初始化上的变化,并详细介绍了RxJava中Schedulers的应用,包括如何实现线程调度以优化网络请求与UI更新流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

~


一、关于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

@Inject
public 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生成一个网络接口时,可以这样做
    
@Override
public 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的功能。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值