同期アダプタに同期があります。同期が呼び出されたら、最初の同期から応答を処理するまで、OSからその同期アダプタへの他の呼び出しをブロックする必要があります。 Single上で.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> 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);
}
そして、ここで私たちは、私は問題が私は何かである疑いがある別のシングル
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);
}
と同期応答を処理update()メソッドとupdateOnePage()メソッドの間で間違っています。 updateOnePage()のsubscribed()が完全に終了してから、もう一度呼び出すことができるようにするにはどうすればよいですか?
これは、single <>にはflatMap(Function、int)がありません。私のシングルをObservable に変更する価値はありますか? –
はい、それだけの価値があります。 –