在我的應用程序中,我有一項服務跟蹤用戶位置,然後使用RxJava
將其發送到服務器。如果請求成功,我收到插入的ID,然後我可以從我的本地數據庫中刪除它們。使RxJava異步任務線程安全
- 查詢了點數據庫發送
- 如果不是空的,我張貼從數據庫
- 所有的聚集點。如果請求成功,我從數據庫中刪除張貼的點
我的問題是,我在前一個任務結束前快速調用該observable,以便服務器接收重複點(兩個請求都是相同的點)。我需要在單線程上執行Observable
以避免在前一個任務結束之前讓另一個任務查詢數據庫。我創建了一個Looper
線程,但仍然,我發送重複,我不知道爲什麼。服務器請求現在似乎要等到它在執行下一個請求之前結束,但仍然在下一個請求中發送相同的點! Gahh
final StoreChangeEvent finalEvent = event;
Observable
.defer(() -> Observable.just(database.getAllPoints()))
.flatMap(pointsList -> (pointsList.isEmpty()) ? Observable.empty() : amazonRetrofit.postAmazonPoints(pointsList)
.map(result -> deletePoint(result))
.doOnError(error -> emitStoreChange(new ErrorMessageEvent(error.getMessage())))
.doOnCompleted(() -> emitStoreChange(finalEvent))
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(AndroidSchedulers.from(backgroundLooper)))
.subscribe();
好像database.getAllPoints()
被稱爲太快......我應該添加.blocking()?
比方說,我有5點發布到服務器(A,B,C,d)
- 我查詢數據庫和發送ABCD服務器
- 我reveive另一點從該裝置(點Ë)
- 我查詢數據庫和發送(ABCDE)
- 我成功接收來自服務器,然後我從L刪除ABCD OCAL DB
- 我收到第二請求成功,那麼我從本地DB
結果刪除ABCDE:ABCD是有兩倍的服務器數據庫上因爲有兩個請求具有相同點發
不太清楚你的意思。你可能會多次訂閱,並希望確定它們隨後被執行? –
是的,只有在前一個Observable完成時才發送點,然後才查詢數據庫...我在問題底部添加了詳細信息 – Jaythaking