RetrofitとRxjava2を使ってネットワーク処理を実装する2018年01月08日(編集2018年01月08日)TweetAndroidアプリ開発では、様々なネットワーク処理が利用できます。その中でもよく利用されている方法の1つにRetrofitとRxjava2を組み合わせる方法があります。この記事は、RetrofitとRxjava2を使ってネットワークAPIに接続してデータを取得する方法を記載した記事です。中級者向けサンプルコードAndroid-Library-DemoRetrofitとRxjava2数あるネットワーク接続実装の中で、RetrofitとRxjavaの組み合わせが、現在(2017年01月07日)もっとも一般的なパターンだと思います。この記事では、RetrofitとRxjava2を連携させてネットワークAPIに接続します。Retrofitこの記事は、Retrofitの使い方は理解している前提となります。理解していない場合は、この記事で学習してください。Rxjava2この記事は、Rxjava2の使い方は理解している前提となります。理解していない場合は、この記事で学習してください。アプリ設計EditTextに郵便番号を入力してボタンを押下すると、ネットワークAPIに非同期で接続して住所を取得します。エラーが発生した場合は、ダイアログを表示します。サンプルコードのAPIには、郵便番号データ配信サービスのzipcloudを利用します。実装APIのインターフェースクラスを作成します。Flowable<Search>}APIに接続する処理を実装します。FlowableAPIの結果をFlowableクラスで取得できるようにします。adapterの追加RetrofitでRxjava2を利用する場合は、adapterを追加します。.build()RxJava2CallAdapterFactoryは、CallAdapter.Factoryを継承したクラスです。Retrofitの処理結果を、RxJava2が利用できる形にします。subscribeOnAndroidではメインスレッドでネットワーク処理をするとandroid.os.NetworkOnMainThreadExceptionの例外がスローされます。android.os.NetworkOnMainThreadExceptionは、アプリケーションがメインスレッドでネットワーク操作を実行しようとしたときにスローされる例外です。これを防ぐために、スレッドを指定します。.subscribeOn(Schedulers.io())subscribeOnメソッドは、データを作る(生産者)処理をどのスレッドで実行するかを設定するメソッドです。ここでいう生産者は、Flowable<Search>になります。Rxjavaでは、Schedulerを使って非同期処理を行うことができます。Schedulers.io()は、必要に応じて新規のスレッドを作成します。observeOnobserveOnメソッドは、データを受け取った側(消費者)の処理を、どのようなSchedule上で行うのかを設定するメソッドです。observeOn(AndroidSchedulers.mainThread())observeOnメソッドが指定したSchedulerが設定したスレッド上で、それ以降の処理を行うようになります。この処理は、データを受け取る側(消費者)がUIのTextViewなので、AndroidSchedulers.mainThread()を使います。AndroidSchedulers.mainThread()は、すべてのUIアクションをAndroidのメインスレッドで実行することができます。viewsが発生します。subscribesubscribe処理は、非ネットワーク時のRxjavaと同じなので説明は省きます。例外処理は、ネットワークエラーの状態を、ユーザーに通知するような処理を実装すると良いでしょう。ここではdialogを使っていますが、Toastで十分だと思います。}}リトライ実装ネットワーク処理を実装すると、ネットワーク接続に失敗した時のことを考慮して、リトライさせたいことがあります。Rxjavaではリトライ処理も用意されています。やり方は色々あるのですが、このサンプルでは一番汎用性の高いFlowable.retryWhenメソッドを利用します。retryWhenretryWhenメソッドは、リトライを行うためのFlowableを生成する関数型インターフェースを引数に渡します。Flowable.errorを呼び出さない場合に、リトライ処理を実行します。}})ここでは、Flowable<Long>を返却するようにしています。Flowable<Long>を返却する理由は、Flowable.timer()を使って数秒の時間をあけてリトライするためです。TimeUnit.SECONDS)は5秒間隔でリトライを実行します。次の接続まで時間をあけない場合は、戻り値をFlowable<Boolean>とすると良いでしょう。Foundの時に、エラーを呼び出しています。Throwable?)メソッドが呼び出されます。}}上記のようにretryWhenメソッドは、エラーの内容によってリトライ回数や条件を細かく設定できます。ProGuardProGuardを使用している場合は、ProGuardに設定が必要です。okhttp3.**かなりの量になります。jsonで利用するmodelをkeepすることを忘れないでください。ファイルの肥大化が嫌な場合は、ファイルを分割すると良いでしょう。retrofitの作者が言うには、ProGuardを使う意味などないので、外すのが1番良いとのこと。いえ、そうもいかない状況もありますよね。ビルド上記のコードの動作を確認してみましょう。通常接続を確認します。通常接続urlを変更して接続を失敗させます。接続失敗リトライでも確認します。リトライ接続うまく動作するのが確認できました。結論RetrofitとRxjava2を組み合わせたネットワーク接続の方法は今後も利用されていくと思うので、理解しておきましょう。いえ、Rxjavaは学習コストが高い技術なので、kotlinを利用している場合はCoroutinesを利用するべきでしょう。