2016-05-03 10 views
7

GoogleマップのOnCameraChangeListenerがトリガーされたときにトリガーになるサブスクライバを書きました。rxandroidはAndroidSchedulers.mainThread()で購読していても、uiスレッドを実行するように求めています

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); 
       } 
      }); 

私は以下のように位置マーカーを更新しています:

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

は、いくつかのいずれかが私を助けてください。私のコードは、私はこのエラーを取得するAndroidSchedulers.mainThread()上で実行するように言うにもかかわらず

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

私のアプローチの問題点を理解してください

+0

http://reactivex.io/RxJava/javadoc/index.html?rx/exceptions/OnErrorNotImplementedException.html。 onErrorのエラーを処理する必要があるかもしれません – Raghunandan

答えて

20

オペレータdebounceはデフォルトで計算スケジューラ上で実行され、そこで流れてくるイベントを配信します。あなたは、メインスレッドスケジューラとそれをパラメータ化する必要があります。

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

はまた、あなたがあなたの通知ソースを作成場所に応じて、あなたはobserveOnsubscribeOnですべてを必要としない場合があります。

+0

あなたのソリューションにはありがとうございます。それは完全に動作します。上記の状況と同様に、私は改造呼び出しをデバウンスしようとしています。私はSOの中の1つを読んでいます。http://stackoverflow.com/questions/33269954/how-to-debounce-a-retrofit-reactive-request-in-javaここでは、retrofitはWebサービスを2度目に呼び出しません。エラーが発生します。java.lang.IllegalStateException:すでに実行されています。私の要点を見ていただけますかhttps://gist.github.com/rakesh1988/f92a8fada282779f971e329e00323a76 –

+0

私はこの問題を解決したと思います。 * call.enqueue *は* call.clone()enqueue()*に置き換えてください。しかし問題は今、私のWebサーバーに複数の呼び出しが発生しています。私はTimber.d( "BRAVO !!!")を見ることができます。何回も印刷する。この問題を解決するための指針はありますか? –

+0

'delay'演算子で同じ問題が発生しました。 最後のパラメータとして 'AndroidSchedulers.mainThread()'を追加することで修正しました。 –

関連する問題