2016-05-03 2 views
7

Ich habe einen Abonnenten geschrieben, der ausgelöst wird, wenn google map OnCameraChangeListener ausgelöst wird.rxandroid fragt nach ui thread, obwohl es auf AndroidSchedulers.mainThread() abonniert ist

Observable.create(new Observable.OnSubscribe<LatLng>() 
    { 
     @Override 
     public void call(Subscriber<? super LatLng> subscriber) 
     { 
      if (!subscriber.isUnsubscribed()) 
      { 
       mMap.setOnCameraChangeListener(cameraPosition -> 
         subscriber.onNext(cameraPosition.target)); 
      } 
     } 
    }).subscribeOn(AndroidSchedulers.mainThread()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .onErrorResumeNext(Observable.<LatLng>empty()) 
      .debounce(1, TimeUnit.SECONDS) 
      .subscribe(position -> { 
       if (position.latitude != 0 && position.longitude != 0) 
       { 
        updateLocationMarker(position); 
       } 
      }); 

Ich Aktualisierung der Standortmarkierung wie folgt:

private void updateLocationMarker(LatLng center) 
{ 
    locationMarkertext.setText("Lat:" + center.latitude + " Long:" + center.longitude); 
    //locationMarkerLayout.setVisibility(View.VISIBLE); 
} 

Auch wenn mein Code sagt auf AndroidSchedulers.mainThread() ich diesen Fehler laufen:

Caused by: rx.exceptions.OnErrorNotImplementedException: Only the original thread that created a view hierarchy can touch its views.

Kann jemand mir bitte helfen zu verstehen, was ist das Problem mit meinem Ansatz

+0

http://reactivex.io/RxJava/javadoc/index.html?rx/exceptions/OnErrorNotImplementedException.html. Möglicherweise müssen Sie nur den Fehler in onError – Raghunandan

Antwort

20

Der Operator debounce wird standardmäßig im Berechnungs-Scheduler ausgeführt, wo es die durchlaufenden Ereignisse liefert. Sie haben es mit dem Haupt-Thread-Scheduler zu parametrieren:

.debounce(1, TimeUnit.SECONDS, AndroidSchedulers.mainThread()) 

Zusätzlich je nachdem, wo Sie Ihre Benachrichtigungsquelle erstellen, können Sie nicht observeOn und subscribeOn überhaupt benötigen.

+0

behandeln Vielen Dank für Ihre Lösung. Es funktioniert perfekt. Ähnlich wie bei der obigen Situation versuche ich einen Nachrüstungsruf zu entlarven. Ich las es in einem der SO http://stackoverflow.com/questions/33269954/how-to-debounce-a-retrofit-reactive-request-in-java, hier, Nachrüstung ruft nicht den Web-Service zum zweiten Mal. Ich erhalte einen Fehler java.lang.IllegalStateException: Bereits ausgeführt. Können Sie bitte einen Blick auf meine wichtigsten https://gist.github.com/rakesh1988/f92a8fada282779f971e329e00323a76 –

+0

Ich denke, ich habe dieses Problem gelöst. * call.enqueue * sollte ersetzt werden durch * call.clone() enqueue() * .... Aber das Problem ist jetzt, ich sehe, dass es mehrere Anrufe auf meinem Webserver gibt. Ich kann Timber.d ("BRAVO !!!") sehen; viele Male drucken. Irgendwelche Hinweise, um dieses Problem zu lösen? –

+0

Hatte das gleiche Problem mit "Verzögerung" -Operator. Es wurde behoben, indem 'AndroidSchedulers.mainThread()' als letzter Parameter hinzugefügt wurde. –

Verwandte Themen