2016-05-01 3 views
0

Ich möchte 2 Observablen kombinieren und führen "kombinieren Funktion" auf AndroidSchedules.mainThread(). Ich habe .observeOn (AndroidSchedules.mainThread()) hinzugefügt, bekomme aber immer noch "java.lang.IllegalStateException: Not on the main thread".combineLatest() -Funktion auf mainThread

Observable<List<Post>> animateCameraAndGetPostsByProjection = Observable.combineLatest(
      mapObservableProvider.getMapReadyObservable(), 
      LocationService.getUpdatedOrLastKnownLocation(this), 
      (googleMap, location) -> { 
       CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(new LatLng(location.getLatitude(),location.getLongitude()),15); 
       googleMap.moveCamera(cameraUpdate); 
       return googleMap.getProjection().getVisibleRegion(); 
      }) 
      .flatMap(vr -> new RestService().getApi().getPostsByMapProjection(vr.farLeft.latitude,vr.farLeft.longitude,vr.nearRight.latitude,vr.nearRight.longitude)) 
      .observeOn(AndroidSchedulers.mainThread()); 
+0

Wohin weist der Fehler? Es ist möglich, dass die API es erfordert, dass Sie sie im Hauptthread aufrufen und nicht den Empfang des Endergebnisses. – akarnokd

+0

Fehler zeigt auf googleMap.moveCamera (cameraUpdate). Ich weiß, dass diese Funktion auf dem Hauptthread ausgeführt werden soll, aber ich weiß nicht, wie Thread der Kombinationsfunktion festgelegt wird. –

+0

Setzen Sie observeOn auf beide Quellen, wenn beide Werte haben, wird die Funktion auf dem Haupt-Thread ausgeführt. – akarnokd

Antwort

4

In diesem Fall müssen Sie die beiden Werte paaren und an den Hauptthread senden.

Observable<List<Post>> animateCameraAndGetPostsByProjection = Observable.combineLatest(
    mapObservableProvider.getMapReadyObservable(), 
    LocationService.getUpdatedOrLastKnownLocation(this), 
    (googleMap, location) -> Pair.of(googleMap, location) 
) 
.observeOn(AndroidSchedulers.mainThread()) 
.map(pair -> { 
    CameraUpdate cameraUpdate = CameraUpdateFactory 
     .newLatLngZoom(new LatLng(pair.second.getLatitude(), 
       pair.second.getLongitude()),15); 
    pair.first.moveCamera(cameraUpdate); 
    return googleMap.getProjection().getVisibleRegion();   
}) 
.flatMap(vr -> new RestService().getApi() 
    .getPostsByMapProjection(vr.farLeft.latitude,vr.farLeft.longitude, 
     vr.nearRight.latitude,vr.nearRight.longitude) 
) 
.observeOn(AndroidSchedulers.mainThread()); 
+0

Was ist der Punkt in observeOn MainThread 2 mal? Und wo zu abonnieren? –

+0

Der RestService kann erneut async gehen und von einem Hintergrundthread ausgegeben werden. observeOn sorgt dafür, dass wir auf die Daten im Hauptthread reagieren. – akarnokd

+0

Wie ändere ich combinateLatest? Zum Beispiel, entfernen Sie eines der Observables? –

Verwandte Themen