在我的应用中,我有一个服务来跟踪用户位置,然后使用
以下是需要执行的步骤:
RxJava
将其发送到服务器。如果请求成功,我会收到插入的 ID,然后可以从本地数据库中删除它们。以下是需要执行的步骤:
- 查询要发送的点
- 如果不为空,则将数据库中收集到的所有点都发送出去
- 如果请求成功,则从数据库中删除已发布的点
Observable
以避免在上一个任务结束之前进行另一个任务的查询。我创建了一个 Looper
线程,但仍然发送重复内容,我不知道为什么。现在似乎服务器请求等待结束后才执行下一个请求,但在下一个请求中,它仍然发送相同的点! 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)
- 我查询数据库并将A-B-C-D发送到服务器
- 我从设备接收到另一个点(E)
- 我查询数据库并发送(A-B-C-D-E)
- 我从第一个请求成功响应后,从本地数据库中删除A-B-C-D
- 我从第二个请求成功响应后,从本地数据库中删除A-B-C-D-E
结果:由于发送了相同的点,A-B-C-D在服务器数据库中出现了两次