rxAndroid介绍及使用实例

一、概念

EventBus有个缺点就是凡是使用了EventBus的类都不能进行混淆了,否则Evnetbus就找不到OnEvent方法了。

RxJava要比EventBus的应用更广泛,EventBus仅仅是作为一种消息的传递工具,但是RxJava里面几乎可以做任何事情。

如果是Android开发的话,可以使用RxAndroid,这是对RxJava的一个扩展,结合sqare公司的retrofit可以很轻松的完成网络的访问。在Android中异步操作一般使用AsycTask来完成,但是AsycTask有很多缺点,如不能方便的终止任务的执行等。
RxAndroid完全可以替代AsycTask来完成各种异步操作,而且还有BindActivity和BindFragment方法,你根本不需要考虑异步操作时的Activity和Fragment的生命周期问题,还有更加强大的的链式调用,可以使程序很简洁。

二、模式

RxJava中有四个基本概念:观察者、被观察者/主题、订阅、事件。

  • Observable/Observer(不支持backpress)
  • Flowable/FlowableSubscriber(支持backpress)
  • Single/SingleObserver(只发送一个onSuccess或者onError的通知)
  • Completable/CompletableObserver(只发送一个onComplete或者onError的通知)
  • Maybe/MaybeObserver(Single与Completable的结合,只发送一个onSuccess或者onComplete或者onError的通知)

2.1 Observable

Observable
.just(1, 2, 3)
.subscribe(new Observer < Integer > () {
@Override public void onSubscribe(Disposable d) {}
@Override public void onNext(Integer value) {}
@Override public void onError(Throwable e) {}
@Override public void onComplete() {}
});

2.2 Flowable

与上一个的区别在于支持背压,也就是说,下游会知道上游有多少数据,所以他Subscriber会是这样

Flowable
.just(1, 2, 3, 4)
.subscribe(new Subscriber < Integer > () {
@Override public void onSubscribe(Subscription s) {
  s.request(Long.MAX_VALUE);
}
@Override public void onNext(Integer integer) {}
@Override public void onError(Throwable t) {}
@Override public void onComplete() {}
});

三、线程切换

//常用的线程策略
Schedulers.immediate()//在当前线程运行,默认为此策略;
Schedulers.newThread()//每次都创建新的线程执行操作;
Schedulers.io()//类似newThread()但是此策略有无限量的线程池,主要用于读写文件、数据库、网络请求等;
Schedulers.computation()//用于需要计算的策略,使用线程池,池大小为CPU核心数;
Schedulers.trampoline()//将任务加入一个队列,等待执行
AndroidSchedulers.mainThread()//在Android主线程中执行,RxAndroid独有

在调用subscribeOn(Schedulers.io())之后,会创建ObservableSubscribeOn

parent.setDisposable(scheduler.scheduleDirect(new Runnable() {
@Override
public void run() {
        source.subscribe(parent);
    }
}
));

在这个过程中,会把source也就是ObservableSource在线程中订阅,同时也把把传入的Observer变成SubscribeOnObserver。若指定的是io线程,可以在IoScheduler中看见对线程的管理。

在调用observeOn(AndroidSchedulers.mainThread())时,会产生一个ObservableObserveOn,同时还会把Observer变成ObserveOnObserver,可以发现在HandlerScheduler,在ui线程调用了ObserveOnObserver的run方法

四、实例

    final Observable<String> mObservable = Observable.create(new Observable.OnSubscribe<String>(){
        @Override
        public void call(Subscriber<? super String> subscriber) {
            Log.e(TAG,Thread.currentThread().getName());
            try {
                sleep(4000);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
            subscriber.onNext("Hello");

            try {
                sleep(1000);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
            subscriber.onNext("Yes,i\'m fine,thank you!");
            subscriber.onCompleted();
        }
    });

    final Observer<String> mTestSubscriber = new Observer<String>() {
        @Override
        public void onCompleted() {
            Log.e(TAG,"onCompleted: "+ Thread.currentThread().getName());
        }

        @Override
        public void onError(Throwable e) {
            Log.e(TAG,"onError: "+ Thread.currentThread().getName());
        }

        @Override
        public void onNext(String s) {
            Log.e(TAG,Thread.currentThread().getName());
            hideWaitingDialog();
            Toast.makeText(MainActivity.this,s,Toast.LENGTH_SHORT).show();
        }
    };

调用

subscribe = mObservable
                        .subscribeOn(Schedulers.io())
                        .doOnSubscribe(new Action0() {
                            @Override
                            public void call() {
                                showWaitingDialog(); // 需要在主线程执行
                            }
                        })
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(mTestSubscriber);
            }

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值