假設我有以下RxJava代碼(訪問一個數據塊,但具體使用情況是不相關的):在RxJava中取消訂閱線程安全嗎?
public Observable<List<DbPlaceDto>> getPlaceByStringId(final List<String> stringIds) {
return Observable.create(new Observable.OnSubscribe<List<DbPlaceDto>>() {
@Override
public void call(Subscriber<? super List<DbPlaceDto>> subscriber) {
try {
Cursor c = getPlacseDb(stringIds);
List<DbPlaceDto> dbPlaceDtoList = new ArrayList<>();
while (c.moveToNext()) {
dbPlaceDtoList.add(getDbPlaceDto(c));
}
c.close();
if (!subscriber.isUnsubscribed()) {
subscriber.onNext(dbPlaceDtoList);
subscriber.onCompleted();
}
} catch (Exception e) {
if (!subscriber.isUnsubscribed()) {
subscriber.onError(e);
}
}
}
});
}
鑑於此代碼,我有以下問題:
如果有人取消訂閱從此方法返回的觀察值(之前的訂閱),是否該操作是線程安全的?無論調度如何,我的'isUnsubscribed()'檢查是否正確?
是否有一個更簡潔的方式與更少的樣板代碼來檢查未訂閱的狀態比我在這裏使用?我在框架中找不到任何東西。我認爲SafeSubscriber解決了用戶未訂閱時不轉發事件的問題,但顯然它沒有。
謝謝,您實際上回答了我的另一個關於創建具有適當背壓支持的「自定義」可觀察的問題!我檢查了SyncSubscriber,它看起來非常好。在很多情況下,我會將操作轉換爲Iterable在語義上有點尷尬,但是知道我們可以通過這種方式輕鬆實現背壓支持,這仍然很好。我發現這個班級仍然被標記爲@Experimental,你認爲它什麼時候可以粗略地考慮到生產準備? –
好聽!下一步是將其發佈到一個版本中(1.0.15版即將推出)。之後,一般情況下,它會進入'@ Beta'狀態或直接進入公共狀態,因爲我們會獲得信心。 – Aaron