Rxjava的使用

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值