(替代)或(正确使用)Activity中的AndroidObservables

时间:2015-01-23 02:15:42

标签: android rx-java

我一直在使用AndroidObservable来进行需要在UI线程上发生的操作。我现在发现自己处于这种情况:我需要在主线程上执行操作,然后根据结果更改UI。我的尝试看起来像这样:

subscription = AndroidObservable.bindActivity(this, Observable.just(null))
    .observeOn(Schedulers.io())
    .subscribe(new Action1<Object>() {
      @Override
      public void call(Object o) {
        if (doCheckThatMustBeOffMainThread()) {
          doSomethingWithTheUI();
        }
      }
    });

这是有问题的,因为我现在正在与主线程的UI进行交互。

我正在部分地使用AndroidObservable,因为我知道(想想?)我可以通过取消订阅onDestroy()来避免内存泄漏,但考虑到AndroidObservable的这种使用似乎是多么做作(创建)一个可以发出null的observable ...)而且我无法与主线程上的UI进行交互,这让我觉得可能有一种更合适的方式来使用AndroidObservable s - 或者一种替代方法,它也可以安全地避免内存泄漏。这可能是什么?

2 个答案:

答案 0 :(得分:0)

您需要将支票移至自己的Observable。这样你就可以控制它运行的调度程序。

Observable<Boolean> doCheckObservable =
        Observable
                .create(new Observable.OnSubscribe<Boolean>() {
                    @Override
                    public void call(Subscriber<? super Boolean> subscriber) {
                        // Runs on the io thread when subscribed to.
                        // Do check that returns true or false.
                        subscriber.onNext(doCheckThatMustBeOffMainThread());
                        subscriber.onCompleted();
                    }
                })
                .subscribeOn(Schedulers.io());

Subscription subscription =
        AndroidObservable
                .bindActivity(this, doCheckObservable)
                .subscribe(new Action1<Boolean>() {
                    @Override
                    public void call(Boolean doThatCheckPassed) {
                        if (doThatCheckPassed) {
                            // bindActivity() makes this run on the main thread.
                            doSomethingWithTheUI();
                        }
                    }
                });

答案 1 :(得分:0)

// NOTE: This is now AppObservable in the latest RxAndroid release.
AndroidObservable.bindActivity(this, Observable.defer(
    new Func0<Observable<Void>>() {

      @Override
      public Observable<Void> call() {
        return doCheckThatMustBeOffMainThread() ?
            Observable.just(null) : Observable.empty();
      }

    })
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Action1<Void>() {

      @Override
      public void call(Void unused) {
        doSomethingWithTheUi();
      }

    }));

这样你仍然可以通过一个observable推送null,但这次它只是被用作一个信号,并且工作发生在你需要的地方:在io land中检查,以及对UI线程的反应