RxJavaとRetrofitでREST APIを叩く

REST APIクライアントのRetrofitとRxJava(RxKotlin)を組み合わせてGitHubのAPIを叩くという処理をいい感じにやっていきます。

Retrofitの導入

まずは諸々のライブラリを導入します。今回はスレッドの管理のためにRxAndroidも使います。また、JSONパーサとしてMoshiを使います。

dependencies {
    //Retrofit
    implementation 'com.squareup.retrofit2:retrofit:2.3.0'
    implementation "com.squareup.retrofit2:adapter-rxjava2:2.3.0"
    implementation "com.squareup.retrofit2:converter-moshi:2.3.0"

    //RxKotlin
    implementation 'io.reactivex.rxjava2:rxkotlin:2.2.0'

    //RxAndroid
    implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
}

パーミッションを追加する

インターネットに接続しないといけないので、パーミッションを追加することを忘れないようにします。AndroidManifest.xmlに1行追加するだけの簡単なお仕事です。

<uses-permission android:name="android.permission.INTERNET"/>

データクラスを定義する

返ってくるJSONの形式に合わせてデータクラスを定義します。今回は以下のように定義しました。

data class User(
        val login: String,
        val id: Int,
        val avatar_url: String,
        val gravatar_id: String,
        val url: String,
        val html_url: String,
        val followers_url: String,
        val following_url: String,
        val gists_url: String,
        val starred_url: String,
        val subscriptions_url: String,
        val organizations_url: String,
        val repos_url: String,
        val events_url: String,
        val received_events_url: String,
        val type: String,
        val site_admin: Boolean,
        val name: String,
        val company: String,
        val blog: String,
        val location: String,
        val email: String,
        val hireable: Boolean,
        val bio: String,
        val public_repos: Int,
        val public_gists: Int,
        val followers: Int,
        val following: Int,
        val created_at: String,
        val updated_at: String
)

エンドポイントを定義する

インターフェースを作ってエンドポイントを定義します。アノテーションでいろいろできます。例えば今回はGetを使っていますがPostも使えます。ユーザー名は毎回指定したいので引数で渡しています。大事な点は、返り値としてObservableとしているところです。こうするとRxJavaのObservableで返してくれます。Userはさっき作ったデータクラスです。

interface GitHubClient {
    @GET("/users/{username}")
    fun getUser(@Path("username") username: String) : Observable
}

Retrofitのインスタンスを作る

ここまで準備ができたら、Retrofitのインスタンスをビルダーパターンで生成します。まずはbaseUrl()でベースURLを指定。今回はaddConverterFactory()でMoshiを使うように指定しています。GsonとかJacksonとかを使うときはよしなに…。次に、addCallAdapterFactoryでRxJavaを使うように指定します。ここまでできたらbuild()でインスタンスを作ります。

val retrofit = Retrofit.Builder()
        .baseUrl("https://api.github.com")
        .addConverterFactory(MoshiConverterFactory.create())
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
        .build()

APIを叩く

作ったRetrofitのインスタンスを使って、GitHubのAPIを叩きます。Androidはメインスレッドで通信処理を書けないので、subscribeOn(Schedulers.newThread())で通信処理を別スレッドで行うように指定しています。その後、RxAndroidのobserveOn(AndroidSchedulers.mainThread())でメインスレッドに処理を戻した後にsubscribeしています。subscribeすると、Observableとして指定したUserのインスタンスが流れてくるので、適当に処理をすればOKです。

retrofit.create(GitHubClient::class.java)
        .getUser("okuzawats")
        .subscribeOn(Schedulers.newThread())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe({user -> run {
            Log.d(tag, user.login)
            Log.d(tag, user.location)
            Log.d(tag, user.bio)
        }})

以上でRxJavaとRetrofitを使ったREST APIを叩くことができました。

茨城県つくば市在住のイケてるメンズです。東京工業大学卒業後、コンサルタントを経て、2016年よりモバイルアプリ(主にAndroid)のエンジニアとして働いています。2017年UI DesignコンテストAndroid部門特別賞受賞。

ご連絡はメールフォームからお願いします。