Rxjava的使用

来源:互联网 发布:淘宝卖家差评链接 编辑:程序博客网 时间:2024/06/14 03:24
mRetrofit = new Retrofit.Builder()        .baseUrl("http://123.56.136.12:3030/api/")        .addConverterFactory(GsonConverterFactory.create())        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//通过RxJavaCallAdapterFactoryRetrofit添加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 接口进行了一些扩展,但他们的基本使用方式是完全一样的:

  1. Subscriber<String> subscriber = new Subscriber<String>() {
  2.     @Override
  3.     public void onNext(String s) {
  4.         Log.d(tag, "Item: " + s);
  5.     }
  6.  
  7.     @Override
  8.     public void onCompleted() {
  9.         Log.d(tag, "Completed!");
  10.     }
  11.  
  12.     @Override
  13.     public void onError(Throwable e) {
  14.         Log.d(tag, "Error!");
  15.     }};

不仅基本使用方式一样,实质上,在 RxJava 的 subscribe 过程中,Observer 也总是会先被转换成一个 Subscriber 再使用。所以如果你只想使用基本功能,选择 Observer 和 Subscriber 是完全一样的。它们的区别对于使用者来说主要有两点:

  1. onStart(): 这是 Subscriber 增加的方法。它会在 subscribe 刚开始,而事件还未发送之前被调用,可以用于做一些准备工作,例如数据的清零或重置。这是一个可选方法,默认情况下它的实现为空。需要注意的是,如果对准备工作的线程有要求(例如弹出一个显示进度的对话框,这必须在主线程执行), onStart() 就不适用了,因为它总是在 subscribe 所发生的线程被调用,而不能指定线程。要在指定的线程来做准备工作,可以使用 doOnSubscribe() 方法,具体可以在后面的文中看到。

  2. unsubscribe(): 这是 Subscriber 所实现的另一个接口 Subscription 的方法,用于取消订阅。在这个方法被调用后,Subscriber 将不再接收事件。一般在这个方法调用前,可以使用 isUnsubscribed() 先判断一下状态。 unsubscribe() 这个方法很重要,因为在 subscribe() 之后, Observable 会持有 Subscriber 的引用,这个引用如果不能及时被释放,将有内存泄露的风险。所以最好保持一个原则:要在不再使用的时候尽快在合适的地方(例如 onPause() onStop() 等方法中)调用unsubscribe() 来解除引用关系,以避免内存泄露的发生。


 Observable.create
是 RxJava 最基本的创造事件序列的方法。基于这个方法, RxJava 还提供了一些方法用来快捷创建事件队列,例如:

  • just(T...): 将传入的参数依次发送出来。

  1. Observable observable = Observable.just("Hello", "Hi", "Aloha");
  2. // 将会依次调用:
  3. // onNext("Hello");
  4. // onNext("Hi");
  5. // onNext("Aloha");
  6. // onCompleted();
  • from(T[]) / from(Iterable<? extends T>) : 将传入的数组或 Iterable 拆分成具体对象后,依次发送出来。

  1. String[] words = {"Hello", "Hi", "Aloha"};
  2. Observable observable = Observable.from(words);
  3. // 将会依次调用:
  4. // onNext("Hello");
  5. // onNext("Hi");
  6. // onNext("Aloha");
  7. // onCompleted();


0 0
原创粉丝点击