RxJavaのAndroidでの応用シーン
インポート
RxLifecycleの使用
なぜRxLifecycleを使うのですか?rxjavaは使用されますが、過度に使用しても解放されないとメモリの漏洩が発生します.RxLifeCycleは、コンポーネントのライフサイクルのある段階またはイベントの発生時に自動的に購読をキャンセルするのに役立ちます.そのプロジェクトアドレスは次のとおりです.https://github.com/trello/RxLifecycle(RxLifecycleの最低APIは14)
使い方も簡単です. RxAppCompatActivityまたはRxLifecycleの他のクラスを継承し、必要に応じて を選択します. bindUntilEventメソッドを使用してライフサイクル をバインド
シーン1:Viewのクリックイベント
シーン2:throttleFirstを使用してボタンの重複クリックを防止
例えば、場合によっては、あるボタンをクリックしてネットワークリクエストを行ったり、次のボタンにアクセスしたりしますが、この操作はすぐに結果が現れるわけではありません.ユーザーが応答がないと思って何度もButtonをクリックしたり、悪意のあるクイッククリックをしたりした場合、このとき
シーン3:View関連のレスポンスアクション
たとえば、
シーン4:intervalサイクルタスク
タスクを周期的に実行する必要がある場合は、rxjavaの
このコードは、5秒ごとにアクションが実行されることを示します.
シーン4:timerタイミングタスク
場合によっては、Rxjavaでは
シーン5:Schedulerスレッド切り替え
たとえば、新しいスレッドで時間のかかる操作を行う必要があり、結果はメインスレッドに戻ります.
シーン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を使用したポーリングリクエスト
//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)
使い方も簡単です.
//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を実現することができます.
シーン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
});