くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

RxAndroidで謎の例外(MissingBackpressureException)が出てハマる

前に作ったアプリの機能追加と合わせて、非同期処理をRxAndroidに置き換えた。ときの備忘録。

play.google.com

環境は以下のような感じ

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] フォローがばれないツイッタークライアント「シャイッター」

f:id:wannabe-jellyfish:20150107213020p:plain

シャイッター-フォローがばれないツイッタークライアント- - Google Play の Android アプリ

参考にしたサイト様