我想创建一个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来证明这一观点。如果是这样的话,如果提供了一个例子,那将是非常棒的。
答案 0 :(得分:1)
目前还不清楚你要做什么。您可能不需要创建可观察对象,而是使用Subject
。
PublishSubject<Thing> thingDetector = PublishSubject.create();
// detector loop
while ( true ) {
Thread.sleep( 100 );
if ( haveAnItem ) {
thingDetector.onNext( next() );
}
if ( allItemsDone ) {
thingDetector.onComplete();
}
}
由于您没有详细说明您与该事物的接触方式,因此我无法更具体。