Android 如何确保在第一次调用完成之前不会再次运行RXJavaObservable

Android 如何确保在第一次调用完成之前不会再次运行RXJavaObservable,android,rx-java,android-syncadapter,Android,Rx Java,Android Syncadapter,我们在同步适配器中有一个同步。调用同步后,我们需要阻止从操作系统到该同步适配器的任何其他调用,直到处理完第一次同步的响应为止。我以为在单曲上调用.blockingGet()就可以了,但事实并非如此。在允许再次调用/订阅单曲之前,如何确保单曲中处理的所有代码都已完成 @Override public void onPerformTrackedSync(Account account, Bundle extras, String authority, ContentProviderClient pr

我们在同步适配器中有一个同步。调用同步后,我们需要阻止从操作系统到该同步适配器的任何其他调用,直到处理完第一次同步的响应为止。我以为在单曲上调用.blockingGet()就可以了,但事实并非如此。在允许再次调用/订阅单曲之前,如何确保单曲中处理的所有代码都已完成

@Override
public void onPerformTrackedSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) {
     try {
        mCurrentUpdater = createUpdater();
        mCurrentUpdater
                .update()
                .blockingGet();
        onSyncCompleted(null);
    } catch (Exception ex) {
        onSyncCompleted(ex);
        onError(ex);
    }
}

@NonNull
public final Single<Complete> update() {
    synchronized (this) {
        if (mUpdateCalled) throw new IllegalStateException("Updaters should not be reused");
        mUpdateCalled = true;
    }
    updateOnePage(); // will call onUpdaterPageSuccess which can continue updating
    return mCompleteSubject
            .take(1)
            .singleOrError();
}

   /**
 * Update an individual "page" of data. Calls to onUpdaterPageSuccess may call back into this function.
*/
void updateOnePage() {
    updateNextPage()
            .subscribe(
                    this::onUpdaterPageSuccess,
                    this::onPageFailure
            );
}
@覆盖
PerformTrackDsync上的公共无效(帐户、捆绑附加、字符串权限、ContentProviderClient提供程序、SyncResult SyncResult){
试一试{
mCurrentUpdater=createUpdater();
mCurrentUpdater
.update()
.blockingGet();
onSyncCompleted(空);
}捕获(例外情况除外){
onSyncCompleted(ex);
onError(ex);
}
}
@非空
公共最终单一更新(){
已同步(此){
如果(mUpdateCalled)抛出新的IllegalStateException(“不应重用更新程序”);
mUpdateCalled=true;
}
updateOnePage();//将调用OnUpdatePageSuccess,它可以继续更新
返回mcomplettesubject
.采取(1)
.singleOrError();
}
/**
*更新单个数据“页面”。对onUpdaterPageSuccess的调用可能会回调到此函数。
*/
void updateOnePage(){
updateNextPage()
.订阅(
此::onUpdaterPageSuccess,
这个::onPageFailure
);
}
这就是所谓的实际网络同步:

protected Single<Page> updateNextPage() {
    runMigrations();
    String syncMarker = AreaSyncService.getSyncMarker();
    Log.i("AAAZ", "Area Sync Requested  " + Thread.currentThread());
    return buildRequestData(new Date())
            .flatMap(requestData -> mSalesRabbitService.syncAreas(syncMarker,
                    requestData.syncedAreas,
                    requestData.syncedAreaUserHistories,
                    requestData.deletedAreaIds,
                    requestData.deletedAreaUserHistoryIds)
                    .map(areaSyncValidated -> Pair.create(areaSyncValidated, requestData)))
            .map(pair -> new Page(pair.first, pair.second))
            .flatMap(this::updateWithPage);
}
protectedsingleupdatenextpage(){
运行迁移();
字符串syncMarker=AreaSyncService.getSyncMarker();
Log.i(“AAAZ”,“请求区域同步”+Thread.currentThread());
返回buildRequestData(新日期())
.flatMap(requestData->mSalesRabbitService.syncAreas(syncMarker,
requestData.syncedAreas,
requestData.syncedAreaUserHistories,
requestData.deleteAids,
requestData.DeleteDareauUserHistoryId)
.map(areaSyncValidated->Pair.create(areaSyncValidated,requestData)))
.map(配对->新页面(配对第一,配对第二))
.flatMap(this::updateWithPage);
}
在这里,我们用另一个单键来处理同步响应

protected Single<Page> updateWithPage(@NonNull Page page) {
    Log.i("AAAZ", "Area Sync Requested  " + Thread.currentThread());
    return Single.just(page)
           .flatMap(this::updateIdTrackersAndLastAreaSyncDevice)
           .flatMap(this::addAreaIdsToNewAreas)
           .flatMap(this::addAreaUserHistoryIdsToNewAreaUserHistories)
           .flatMap(this::updateAreas)
           .flatMap(this::updateHistories)
           .flatMap(this::createAreas)
           .flatMap(this::createHistories)
           .flatMap(this::resetCacheFirstTime)
           .flatMap(this::postChangedEvents)
           .flatMap(this::handleDeletionsResetCachePostEvent)
           .flatMap(this::housekeepingIfApplicable);
}
受保护的单个updateWithPage(@NonNull Page){
Log.i(“AAAZ”,“请求区域同步”+Thread.currentThread());
返回单程。仅返回(第页)
.flatMap(此::updateIdTrackersAndLastAreaSyncDevice)
.flatMap(此::AddAreaIDstoneAreas)
.flatMap(此::AddAreaUserHistoryDstoneWareAUserHistories)
.flatMap(this::updateAreas)
.flatMap(此::updateHistories)
.flatMap(此::createAreas)
.flatMap(此::createHistories)
.flatMap(此::resetCacheFirstTime)
.flatMap(此::postChangedEvents)
.flatMap(this::HandleDeletesResetCachePostEvent)
.flatMap(此::housekeepingi适用);
}

我怀疑这个问题是我在update()方法和updateOnePage()方法之间做错了什么。如何确保updateOnePage()中的单个订阅()在再次调用之前完全完成?

作为构建查询的观察者链的一部分,在
UpdateNext()
的末尾,有一个
flatMap()
操作符调用
updateOnePage()
flatMap()
接受一个额外的参数,即并行操作的数量。添加参数1

.flatMap(this::updateWithPage, 1);

作为构建查询的观察者链的一部分,在
updateNextPage()
的末尾,有一个
flatMap()
操作符调用
updatenepage()
flatMap()
接受一个额外的参数,即并行操作的数量。添加参数1

.flatMap(this::updateWithPage, 1);

似乎Single没有flatMap(函数,int)。把我的单曲改成可观察的值得吗?是的,值得。单曲似乎没有平面图(函数,int)。把我的单曲改成可观察的值得吗?是的,值得。