参考:http://gank.io/post/560e15be2dca930e00da1083
Rx的意思是响应式扩展,RXJava是基于观察者模式的一种编程模型,作用就是提供了一致的编程接口,方便开发者处理异步数据流。
1、使用
https://github.com/ReactiveX/RxJava
https://github.com/ReactiveX/RxAndroid
compile 'io.reactivex:rxandroid:1.2.1' // Because RxAndroid releases are few and far between, it is recommended you also // explicitly depend on RxJava's latest version for bug fixes and new features. compile 'io.reactivex:rxjava:1.1.6'
2.例子
Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { subscriber.onNext("hello"); } }).subscribe(new Subscriber<String>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(String s) { Log.d("rx", s); } });输出结果为
D/rx: hello
3、基本概念:
Observable(被观察着,如Button按钮)
Observer(观察者,如onClickListener实现类)
subscribe(订阅,如setOnClickListener)
事件(event,如onCLick)
4、Rxjava中的事件
onNext event事件
onComplete 没有新的onNext发出时,调用onComplete
onError 事件处理异常时调用,并停止队列,接下来没有任何事件
5、实现
5.1.Observer,观察者,他决定了事件响应的行为
Subscriber,订阅者,实现了Observer的抽象类,增加了onStart,unSubscribe等方法,
onStart:在Subscribe刚开始,还没有事件的时候调用,他是在subscribe方法所在的线程中被调用
unSubscribe,解除订阅,在解除之前可以先判断一下isUnSubscribed,这个方法会解除Observable对Subscriber的引用
5.2.Observable被观察者,他决定了什么时候触发事件(调用时机),以及触发怎样的事件(setOnClick,setOnLongClick)
通过Observable.create方法创建observable对象并定义事件触发规则(触发规则在onSubscribe中的call方法实现),还有just(T...)方法(将传入的参数依次发送出去),from(T[] )/from(Iterable<? extends T>)(将传入的数组或迭代器拆成具体对象依次发送出去)
5.3subscribe订阅
通过Observable的subscribe方法将观察者和被观察者联系起来,内部subscribe方法是通过subscriber/observer调用onStart方法做些初始化工作,然后调用onSubscribe的call方法,并返回订阅者或观察者,以方便取消订阅。
整体图示如下:
5.4自定义不完整定义的回调
1个onNextAction
Action1<String> onNextAction = new Action1<String>() {//Action1带有一个参数 // onNext() @Override public void call(String s) { Log.d("x", s); } }; String[] names = {"gu", "xu", "min"}; Observable observable = Observable.from(names); observable.subscribe(onNextAction);//onNextAction,onComplete可以看做包装类,onComplete不可单独使用输出 gu,xu,min
3个均有:
Action0 onComplete = new Action0() {//Action0没有参数 @Override public void call() { Log.d("y", "OK!"); } }; Action1<String> onNextAction = new Action1<String>() {//Action1带有一个参数 // onNext() @Override public void call(String s) { Log.d("x", s); } }; Action1<Throwable> onError = new Action1<Throwable>() { @Override public void call(Throwable throwable) { Log.d("x", throwable.toString()); }//Action1带有一个参数 }; // Observable observable; String[] names = {"gu", "xu", "min"}; Observable observable = Observable.from(names); observable.subscribe(onNextAction,onError,onComplete);//onNextAction,onComplete可以看做包装类,onComplete不可单独使用 }输出结果:
D/x: gu
D/x: xu
D/x: min
D/y: OK!
6、同步观察者模式(同一个线程)例子
final int drawableRes = R.mipmap.ic_launcher; final ImageView imageView = (ImageView) findViewById(R.id.imageView); Observable.create(new Observable.OnSubscribe<Drawable>() { @Override public void call(Subscriber<? super Drawable> subscriber) { Drawable drawable = getTheme().getDrawable(drawableRes);//触发的事件 subscriber.onNext(drawable); subscriber.onCompleted(); } })//创建一个被观察者对象 .subscribe(new Observer<Drawable>() {//订阅消息 @Override public void onNext(Drawable drawable) { imageView.setImageDrawable(drawable); } @Override public void onCompleted() { } @Override public void onError(Throwable e) { Toast.makeText(MainActivity.this, "Error!", Toast.LENGTH_SHORT).show(); } });上面例子实现在布局文件的ImageView控件上显示一张图片,事件的发出(call)和消费(onNext,onComplete...)在同一个线程中(Rxjava中的默认情况)