可观察间隔flatMap组合不起作用

时间:2017-11-21 16:38:44

标签: android rx-java2

我是rxjava 2的新手,我试图在给定间隔的后台执行someMethod,并在UI线程上使用结果。有人能指出我在我的代码中犯了什么错误,甚至更好地提供了能够完成我需要的工作的最佳代码吗?

@Override
  protected void onStop() {
    subject.onNext(Long.valueOf(10005));
    observable.unsubscribeOn(Schedulers.io());
    super.onStop();
  }

private void initAzimuthUpdater() {
    subject = PublishSubject.create();

    observable = Observable.interval(500, TimeUnit.MILLISECONDS)
        .takeWhile(new Predicate<Long>() {
          @Override
          public boolean test(@NonNull Long aLong) throws Exception {
            Log.d(TAG, "xxxxxxxxxxxx test: " + aLong);
            return aLong != Long.valueOf(10005);
          }
        });

    observable.flatMap(new Function<Long, ObservableSource<Float>>() {
          @Override
          public ObservableSource<Float> apply(@NonNull Long aLong) throws Exception {
            return PublishSubject.create(new ObservableOnSubscribe<Float>() {

              @Override
              public void subscribe(@NonNull ObservableEmitter<Float> e) throws Exception {
                e.onNext(someMethod());
              }
            });
          }
        }).subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Observer<Float>() {
          @Override
          public void onSubscribe(@NonNull Disposable d) {
            Log.d(TAG, "xxxxxxxx onSubscribe:" + System.currentTimeMillis());
            isRunning = true;
          }

          @Override
          public void onNext(@NonNull Float o) {
            Log.d(TAG, "xxxxxxxx onNext:" + System.currentTimeMillis());
            //update UI
          }

          @Override
          public void onError(@NonNull Throwable e) {
            Log.d(TAG, "xxxxxxxx onError:" + System.currentTimeMillis());
          }

          @Override
          public void onComplete() {
            Log.d(TAG, "xxxxxxxx onComplete:" + System.currentTimeMillis());
          }
        });

    subject.mergeWith(azimuthObservable);
  }

1 个答案:

答案 0 :(得分:0)

您应该使用DisposableObserversubscribeWith,将Disposable保存到CompositeDisposable,然后从clear()拨打onStop()Observable运算符返回一个新实例,因此忽略它们的返回值将不会影响原始流。

CompositeDisposable composite = new CompositeDisposable();

@Override
protected void onStop() {
    composite.clear();
    super.onStop();
}

private void initAzimuthUpdater() {

    Disposable d = Observable.interval(500, TimeUnit.MILLISECONDS)
       .flatMap(new Function<Long, ObservableSource<Float>>() {
          @Override
          public ObservableSource<Float> apply(@NonNull Long aLong) 
                  throws Exception {
            return Observable.create(new ObservableOnSubscribe<Float>() {

              @Override
              public void subscribe(@NonNull ObservableEmitter<Float> e) 
                    throws Exception {
                e.onNext(someMethod());
              }
            });
          }
        }).subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribeWith(new DisposableObserver<Float>() {
            @Override
            public void onStart() {
                Log.d(TAG, "xxxxxxxx onSubscribe:" + System.currentTimeMillis());
                isRunning = true;
          }

          @Override
          public void onNext(@NonNull Float o) {
            Log.d(TAG, "xxxxxxxx onNext:" + System.currentTimeMillis());
            //update UI
          }

          @Override
          public void onError(@NonNull Throwable e) {
            Log.d(TAG, "xxxxxxxx onError:" + System.currentTimeMillis());
          }

          @Override
          public void onComplete() {
            Log.d(TAG, "xxxxxxxx onComplete:" + System.currentTimeMillis());
          }
        });

    composite.add(d);
}