2017-11-16 4 views
1

同期アダプタに同期があります。同期が呼び出されたら、最初の同期から応答を処理するまで、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()が完全に終了してから、もう一度呼び出すことができるようにするにはどうすればよいですか?

答えて

0

updateNextPage()の最後に、クエリが作成されるオブザーバーチェーンの一部として、updateOnePage()を呼び出すflatMap()演算子があります。 flatMap()は、パラレル操作の数である追加の引数をとります。パラメータを追加します。

.flatMap(this::updateWithPage, 1); 
+0

これは、single <>にはflatMap(Function、int)がありません。私のシングルをObservable に変更する価値はありますか? –

+0

はい、それだけの価値があります。 –

関連する問題