前に作ったアプリの機能追加と合わせて、非同期処理をRxAndroidに置き換えた。ときの備忘録。
環境は以下のような感じ
android { compileSdkVersion 24 buildToolsVersion '25.0.2' defaultConfig { minSdkVersion 16 // Android 4.1 targetSdkVersion 24 // Android 7.0 } } dependencies { compile 'io.reactivex:rxjava:1.1.5' compile 'io.reactivex:rxandroid:1.2.0' }
端末で確認すると謎の例外がでた。。
置き換えをして、動作確認しようとおもったら、上手く動かず。。
logcatで見ていると、こんなエラーが。。。
Caused by: rx.exceptions.MissingBackpressureException at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.onNext(OperatorObserveOn.java:138) at rx.internal.operators.OnSubscribeTimerPeriodically$1.call(OnSubscribeTimerPeriodically.java:51) at rx.Scheduler$Worker$1.call(Scheduler.java:120) at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
petitvioletさんのQiita記事によると、通信処理にRxJavaを使うと上記の問題が起こるとのこと。
解決策(onBackpressureBuffer()
を追加する)
以下のようにobserveOn()
より前に、onBackpressureBuffer()
をcallすればOK。
petitvioletさんのQiita記事からの引用。
new Client(url).get() .onBackpressureBuffer() // ここ .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) // .onBackpressureBuffer() ここだとダメ .subscribe(/** なにか処理 **/);
以上!!
[PR] フォローがばれないツイッタークライアント「シャイッター」
シャイッター-フォローがばれないツイッタークライアント- - Google Play の Android アプリ