RxJavaのAndroidでの応用シーン

7561 ワード

インポート
//rxjava
compile 'io.reactivex:rxjava:latest.release'
//rxAndroid
compile 'io.reactivex:rxandroid:latest.release'
//rxLifecycle
compile 'com.trello:rxlifecycle:latest.release'
compile 'com.trello:rxlifecycle-components:latest.release'
compile 'com.trello:rxlifecycle-android:latest.release'

RxLifecycleの使用
なぜRxLifecycleを使うのですか?rxjavaは使用されますが、過度に使用しても解放されないとメモリの漏洩が発生します.RxLifeCycleは、コンポーネントのライフサイクルのある段階またはイベントの発生時に自動的に購読をキャンセルするのに役立ちます.そのプロジェクトアドレスは次のとおりです.https://github.com/trello/RxLifecycle(RxLifecycleの最低APIは14)
使い方も簡単です.
  • RxAppCompatActivityまたはRxLifecycleの他のクラスを継承し、必要に応じて
  • を選択します.
  • bindUntilEventメソッドを使用してライフサイクル
  • をバインド
    //1.        RxAppCompatActivity
    public class MainActivity extends RxAppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            // onCreate()   ,     onDestory()       
            Observable.interval(5, TimeUnit.SECONDS).
                    compose(bindUntilEvent(ActivityEvent.DESTROY))
                    .doOnUnsubscribe(() ->{
                            Log.d("MainActivity", "    ");}
                    ).subscribe(aLong -> {
                    Log.d("MainActivity", "start task:" + Thread.currentThread().getName());
            });
        }
    
    }

    シーン1:Viewのクリックイベント
     RxView.clicks(TextView)
    .compose(bindUntilEvent(ActivityEvent.DESTROY)).subscribe(aVoid -> {
                       ...do some things
                    });

    シーン2:throttleFirstを使用してボタンの重複クリックを防止
    例えば、場合によっては、あるボタンをクリックしてネットワークリクエストを行ったり、次のボタンにアクセスしたりしますが、この操作はすぐに結果が現れるわけではありません.ユーザーが応答がないと思って何度もButtonをクリックしたり、悪意のあるクイッククリックをしたりした場合、このときthrottleFirstを使用してこの問題を解決することができます.
    RxView.clicks(TextView)
    .compose(bindUntilEvent(ActivityEvent.DESTROY))
     .throttleFirst(1L,TimeUnit.SECONDS).subscribe(aVoid -> {
                       ...do some things
                    });

    シーン3:View関連のレスポンスアクション
    たとえば、EditeTextの出力をリスニングするには、RxTextView.textChangesを使用します.さらに、RxBindingプロジェクトの説明を参照することもできます.https://github.com/JakeWharton/RxBinding.
     //    view  
            RxTextView.textChanges(EditeText).compose(bindUntilEvent(ActivityEvent.DESTROY))
                    .subscribe(charSequence -> {
                ...do some things
            });

    シーン4:intervalサイクルタスク
    タスクを周期的に実行する必要がある場合は、rxjavaのintervalを使用します.
     Observable.interval(5, TimeUnit.SECONDS).subscribe(aLong -> {
                    ...do some things
            });

    このコードは、5秒ごとにアクションが実行されることを示します.
    シーン4:timerタイミングタスク
    場合によっては、Rxjavaではtimerを使用することができます.
    Observable.timer(2, TimeUnit.SECONDS).subscribe(aLong -> {
                  ...do some things   
            });

    シーン5:Schedulerスレッド切り替え
    たとえば、新しいスレッドで時間のかかる操作を行う必要があり、結果はメインスレッドに戻ります.
    Observable.just(1, 2, 3, 4)  
                .subscribeOn(Schedulers.io()) //    subscribe()     IO     
                .observeOn(AndroidSchedulers.mainThread()) //    Subscriber            
                .subscribe(number ->{
                  ...do some things   
                }); 

    シーン6:retrofitと組み合わせて使用
    rxjavaとretrofitを使用してネットワークリクエストを行うと、スレッドの切り替えやデータの変換などを簡単に行うことができます.具体的には、RxJavaとRetrofitを組み合わせたベストプラクティス記事を参照してください.
    シーン7:EventBus、ottoの代わりにRxBusを使用
    RxBusはライブラリではなく、RxJavaのアイデアを使ってEventBusのデータ伝達効果を達成するモデルで、以下の文章で自分でRxBusを実現することができます.
  • http://blog.kaush.co/2014/12/24/implementing-an-event-bus-with-rxjava-rxbus/
  • http://blog.csdn.net/a1018875550/article/details/52083187

  • シーン8:schedulePeriodicallyを使用したポーリングリクエスト
    Observable.create(new Observable.OnSubscribe() {  
                @Override  
                public void call(final Subscriber super String> observer) {  
    
                    Schedulers.newThread().createWorker()  
                          .schedulePeriodically(new Action0() {  
                              @Override  
                              public void call() {  
                                  observer.onNext(doNetworkCallAndGetStringResult());  
                              }  
                          }, INITIAL_DELAY, POLLING_INTERVAL, TimeUnit.MILLISECONDS);  
                }  
            }).subscribe(s ->{
               ...do some things   
            });