创建异步发出的Observable

时间:2017-10-22 20:42:30

标签: android rx-java observable rx-android

我想创建一个Observable来检测内容。这些是及时发现的,并且在订阅者订阅时不可用。我该如何处理?

我的尝试是创建一个Observable:

Observable.create(new AsyncOnSubscribe<Object, Thing>() {
    @Override
    protected Object generateState() { return null; /* state not presented for the sake of simplicity */ }

    @Override
    protected Object next(Object state, long requested, Observer<Observable<? extends Thing>> observer) {
        if(haveMoreThings()) {
            while (!nextThingAvailable()) {
                SystemClock.sleep(100);
            }

            observer.onNext(Observable.just(getNextThing());
        } else {
            observer.onCompleted();
        }
        return null;
    }
});

这样可行,但由于存在一些我无法弄清楚的问题,因此是不行的:

第一个问题 如何检查观察者是否未取消订阅?使用已弃用的Observable.create()可以执行以下操作:

Observable.create(subscriber -> {
            if(subscriber.isUnsubscribed()){
                // stop detecting things
            }
        });

第二个问题:有什么方法可以等到有东西可用(在可观察的范围内)? SystemClock.sleep(x);是可行的吗?

设计问题:为此我可能更容易使用Subject,但我没有足够的exp与rxJava来证明这一观点。如果是这样的话,如果提供了一个例子,那将是非常棒的。

1 个答案:

答案 0 :(得分:1)

目前还不清楚你要做什么。您可能不需要创建可观察对象,而是使用Subject

PublishSubject<Thing> thingDetector = PublishSubject.create();

// detector loop
while ( true ) {
  Thread.sleep( 100 );
  if ( haveAnItem ) {
    thingDetector.onNext( next() );
  }
  if ( allItemsDone ) {
    thingDetector.onComplete();
  }
}

由于您没有详细说明您与该事物的接触方式,因此我无法更具体。