동기화 어댑터에 동기화가 있습니다. 동기화가 호출되면 우리는 첫 번째 동기화에서 응답을 처리 할 때까지 OS에서 해당 동기화 어댑터로의 다른 호출을 차단해야합니다. 싱글에서 .blockingGet()을 호출하면 트릭을 수행 할 수 있다고 생각했지만 그렇지 않습니다. 어떻게하면 싱글이 다시 호출되도록 허용하기 전에 싱글에서 처리되는 모든 코드가 끝나는지 확인할 수 있습니까?첫 호출이 끝날 때까지 rx java observable이 다시 실행되지 않도록하는 방법
@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
);
}
이되는 실제 네트워크 동기화라고했다 : 우리는 내가 문제를 의심 다른 단일
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);
}
와 동기화 응답을 처리
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);
}
을 그리고 여기가 난 뭔가 update() 메서드와 updateOnePage() 메서드간에 잘못되었습니다. updateOnePage()의 단일 구독()이 완전히 호출되기 전에 완전히 완료되는지 어떻게 확인할 수 있습니까?
단일 <>에는 flatMap (Function, int)이 없습니다. 내 단일을 Observable 으로 변경하는 것이 가치가 있습니까? –
네, 그만한 가치가 있습니다. –