2017-01-12 7 views
-1

RxJavaを少し使っていて、その利点が分かります。 onStop()にサブスクリプションが登録解除されたときに、匿名の内部クラスがガベージコレクションされるということです。AndroidのView#をRxJavaにポストする(Runnable)

RxJavaの新機能です。申し訳ありませんが、これが正しくない場合は、

おそらくのようなもの:

pager.post(new Runnable() { 
    public void run() { 
     final int currentItem = pager.getCurrentItem(); 
     pager.setAdapter(new MyAdapter(getSupportFragmentManager())); 
     pager.setCurrentItem(currentItem); 
    } 
}); 

は次のようになります。私が尋ねる

Observable.just(pager) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribeOn(AndroidSchedulers.mainThread()) 
    .subscribe(pager -> { 
     final int currentItem = pager.getCurrentItem(); 
     pager.setAdapter(new MyAdapter(getSupportFragmentManager())); 
     pager.setCurrentItem(currentItem); 
    }); 

理由は、私がViewPagerを回転させて更新する際に問題に遭遇していると、それは匿名の内部のRunnableが判明していることですpost(Runnable)に渡されます。タスクにWeakReferenceという静的な内部クラスを作成する時間を節約できます。

+0

あなたが最初に経験しているところでは、どのような問題がありますか? Reactiveは、そのメリットとともに複雑さを増しています。本当に最初にそれが必要なのであれば、考えるのは賢明でしょう。 –

+0

私はViewPagerをリフレッシュしていましたが、アクティビティが破棄されたときにリフレッシュが発生し、このようなクラッシュが発生する可能性があります。https://code.google.com/p/android/issues/detail?id=218912 –

答えて

0

いつこの実行可能な投稿をしますか?要するに

RxJavaは、このシナリオでは特に有用ではない、それはハンドラで行うことができます。

詳細:

どちらのコードセグメントは、ほとんど同じことを行います、彼らは最終的に(つまり、中にキューに入れられ、他のアクションと順番に処理されるメインスレッドハンドラで実行可能/アクションを掲載しますメインスレッド)。

別のスレッドから実行すると、メインスレッドでアクティビティの終了/破棄を行う 'レース'が発生する可能性があります。これは、ビューページャーをもう使用できなくするアクションが呼び出されます。 'viewPagerオブジェクトであり、クラッシュ/ヌル例外が発生する可能性があります。

終了/破棄操作(viewPagerを '生きていない'ライフサイクルイベントがあったとしても)でメインスレッドのオブザーバブルから退会すると、アクションは呼び出されず、クラッシュは防げます。

同様にHandler.removeCallbacksを使用し、Handler.post()を使用してView.post(内部的にハンドラを使用)を使用する代わりにこれを使用できます。