安卓,Rxjava观察者被观察者操作

46 阅读1分钟
  1. Observable(被观察者)

    • create(new ObservableOnSubscribe())
      通过Observable.create()创建一个Observable对象
    • subscribeOn(Schedulers.io())
      subscribeOn()改变调用它之前代码的线程
      相当于开了一个新线程
    • observeOn(AndroidSchedulers.mainThread())
      observeOn()改变调用它之后代码的线程
    • subscribe(new Observer())
  2. Observable:在观察者模式中称为“被观察者”;
    Observer:观察者模式中的“观察者”,可接收Observable发送的数据;
    subscribe:订阅,观察者与被观察者,通过subscribe()方法进行订阅;
    观察者,可以订阅(Subscribe)或者注册(Register)被观察者类似于监听器,当某一个操作使被观察者触发了判断条件就通知观察者,做出相应的反应,
    比如: 用水壶烧水,水开了赶紧关火,水壶不管温度多高一直烧,人去判断什么时候关火

  3. 观察者被观察者中间发送数据是用ObservableEmitter发射器,由发射器来发送数据

 public static void loginAsync(final Context context, final String loginName,
                                  final String password, final Consumer<LoginResult> action) {
        //创建一个被观察者
        Observable
            .create(new ObservableOnSubscribe<LoginResult>() {
                @Override
                public void subscribe(ObservableEmitter<LoginResult> e) throws Exception {
                    //调用本类的login方法执行登陆
                    LoginResult result = login(context, loginName, password);
                    e.onNext(result);
                }
            })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
                //被观察者订阅观察者
            .subscribe(new Observer<LoginResult>() {
                @Override
                public void onComplete() {
                }

                @Override
                public void onError(Throwable e) {
                }

                @Override
                public void onSubscribe(Disposable d) {
                }

                @Override
                public void onNext(LoginResult result) {
                    //当被观察者执行完了操作发给观察者,就执行传入的回调函数
                    if (action != null) {
                        try {
                            action.accept(result);
                            Log.w(TAG,"执行完毕");
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            });
    }