mRetrofit = new Retrofit.Builder() .baseUrl("http://123.56.136.12:3030/api/") .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//通过RxJavaCallAdapterFactory为Retrofit添加RxJava支持 .build();
compile 'io.reactivex:rxandroid:1.2.1'
compile 'io.reactivex:rxjava:1.1.6'
package com.zgs.rxjavatext; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import rx.Observable; import rx.Observer; import rx.Subscriber; public class MainActivity extends AppCompatActivity { /** * Android 开发中一个比较典型的例子是点击监听器 OnClickListener 。对设置 OnClickListener 来说 * , View 是被观察者, OnClickListener 是观察者,二者通过 setOnClickListener() 方法达成订阅关系 * 。订阅之后用户点击按钮的瞬间,Android Framework 就会将点击事件发送给已经注册的 OnClickListener 。 */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /** * Observer 即观察者,观察者收到被观察者(Observable)的消息,执行具体事件 * onNext()相当于 onClick() / onEvent() * onCompleted()不会再有新的onNext() 发出时,需要触发 onCompleted() 方法作为标志完结。 * onError(): 事件队列异常。在事件处理过程中出异常时,onError() 会被触发,同时队列自动终止,不允许再有事件发出。 * 在一个正确运行的事件序列中, onCompleted() 和 onError() 有且只有一个,并且是事件序列中的最后一个。 * */ Observer<String> observer = new Observer<String>() { @Override public void onNext(String s) { System.out.printf("--"+s); } @Override public void onCompleted() { Log.d("rxjava", "Completed!"); } @Override public void onError(Throwable e) { Log.d("rxjava", "Error!"); } }; /** * Observable 即被观察者,它决定什么时候触发事件以及触发怎样的事件。 * */ Observable observable = Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { subscriber.onNext("Hello"); subscriber.onNext("nihao"); subscriber.onCompleted(); } }); /** * 进行订阅 相当于setOnClickListener() * 当 Observable 被订阅的时候,OnSubscribe 的 call() 方法会自动被调用,事件序列就会依照设定依次触发 * Observable.subscribe(Subscriber) 的内部实现是这样的(仅核心代码): * public Subscription subscribe(Subscriber subscriber) { subscriber.onStart(); onSubscribe.call(subscriber); return subscriber; } * */ observable.subscribe(observer); } }
了 Observer 接口之外,RxJava 还内置了一个实现了 Observer 的抽象类:Subscriber。 Subscriber 对 Observer 接口进行了一些扩展,但他们的基本使用方式是完全一样的:
- Subscriber<String> subscriber = new Subscriber<String>() {
- @Override
- public void onNext(String s) {
- Log.d(tag, "Item: " + s);
- }
- @Override
- public void onCompleted() {
- Log.d(tag, "Completed!");
- }
- @Override
- public void onError(Throwable e) {
- Log.d(tag, "Error!");
- }};
不仅基本使用方式一样,实质上,在 RxJava 的 subscribe 过程中,Observer 也总是会先被转换成一个 Subscriber 再使用。所以如果你只想使用基本功能,选择 Observer 和 Subscriber 是完全一样的。它们的区别对于使用者来说主要有两点:
-
onStart(): 这是 Subscriber 增加的方法。它会在 subscribe 刚开始,而事件还未发送之前被调用,可以用于做一些准备工作,例如数据的清零或重置。这是一个可选方法,默认情况下它的实现为空。需要注意的是,如果对准备工作的线程有要求(例如弹出一个显示进度的对话框,这必须在主线程执行), onStart() 就不适用了,因为它总是在 subscribe 所发生的线程被调用,而不能指定线程。要在指定的线程来做准备工作,可以使用 doOnSubscribe() 方法,具体可以在后面的文中看到。
-
unsubscribe(): 这是 Subscriber 所实现的另一个接口 Subscription 的方法,用于取消订阅。在这个方法被调用后,Subscriber 将不再接收事件。一般在这个方法调用前,可以使用 isUnsubscribed() 先判断一下状态。 unsubscribe() 这个方法很重要,因为在 subscribe() 之后, Observable 会持有 Subscriber 的引用,这个引用如果不能及时被释放,将有内存泄露的风险。所以最好保持一个原则:要在不再使用的时候尽快在合适的地方(例如 onPause() onStop() 等方法中)调用unsubscribe() 来解除引用关系,以避免内存泄露的发生。
Observable.create
是 RxJava 最基本的创造事件序列的方法。基于这个方法, RxJava 还提供了一些方法用来快捷创建事件队列,例如:
-
just(T...): 将传入的参数依次发送出来。
- Observable observable = Observable.just("Hello", "Hi", "Aloha");
- // 将会依次调用:
- // onNext("Hello");
- // onNext("Hi");
- // onNext("Aloha");
- // onCompleted();
-
from(T[]) / from(Iterable<? extends T>) : 将传入的数组或 Iterable 拆分成具体对象后,依次发送出来。
- String[] words = {"Hello", "Hi", "Aloha"};
- Observable observable = Observable.from(words);
- // 将会依次调用:
- // onNext("Hello");
- // onNext("Hi");
- // onNext("Aloha");
- // onCompleted();