2017-11-16 20 views
1

동기화 어댑터에 동기화가 있습니다. 동기화가 호출되면 우리는 첫 번째 동기화에서 응답을 처리 할 때까지 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()의 단일 구독()이 완전히 호출되기 전에 완전히 완료되는지 어떻게 확인할 수 있습니까?

답변

0

쿼리가 생성되는 관찰자 체인의 일부로 updateNextPage() 끝에 updateOnePage()을 호출하는 flatMap() 연산자가 있습니다. flatMap()은 병렬 작업의 수인 추가 인수를 취합니다. 매개 변수를 추가하십시오.

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

단일 <>에는 flatMap (Function, int)이 없습니다. 내 단일 을 Observable 으로 변경하는 것이 가치가 있습니까? –

+0

네, 그만한 가치가 있습니다. –