LoginSignup
8
10

More than 3 years have passed since last update.

Kotlin+fuel-coroutinesを使ってHTTP通信

Last updated at Posted at 2019-09-23

fuel-coroutinesを使った非同期HTTP通信がとても簡単だったのでメモ。

Fuel自体はKotlin全般で利用できますが、今回はAndroidアプリ開発を想定しています。

Fuelとは

KotlinでHTTP通信できるライブラリです。こちらにわかりやすく使い方がまとまっています。

FuelのGitHubリポジトリを見るとわかると思うのですが、いろんなパッケージの集合体という形をとっています。今回利用するfuel-coroutinesはその中の一つです。

なぜfuel-coroutinesなのか

Fuelの特徴として「同期でも非同期でも書ける」というものがありますが、fuelのみだと非同期まわりの融通があまり効きません。結局「自前のコルーチンに同期処理を書く」ということになります。

fuel-coroutinesはKotlinのコルーチンライブラリであるKotlinX Coroutinesを利用しているため、コルーチンが扱いやすいです。

また、KotlinX Coroutinesと同じ書き方(というか同じものですが)でコルーチン制御できるため、検索しやすいです。(Kotlinのコルーチンについてはこちらがわかりやすいです。)

AndroidはメインスレッドでWebリクエストが送れないので、素直にfuel-coroutinesを使ったほうが色々楽です。

依存関係を書く

Build.gradleに依存関係を書きます

Build.gradle
dependencies {
    implementation "com.github.kittinunf.fuel:fuel:2.2.1"
    implementation "com.github.kittinunf.fuel:fuel-android:2.2.1"
    implementation "com.github.kittinunf.fuel:fuel-coroutines:2.2.1"
}

fuelは様々なパッケージの集合体ですが、今回使うのはfuel fuel-android fuel-coroutinesです。3つともgradleに書きましょう。

使ってみる

まずはサンプルを少し変えたものを。

sample.kt
val url = "https://hoge.con"
val tag = "hoge"
runBlocking {
    val (request, response, result) = url.httpGet().awaitStringResponseResult()

    result.fold(
        { data -> Log.d(tag, data)},
        { error -> Log.e(tag, "An error of type ${error.exception} happened: ${error.message}") }
    )
}

見ての通りWebリクエストに成功したときはresult.foldの第一引数の関数が、失敗のときは第二引数の関数が実行されます。

リクエストパラメータを追加したいときはhttpGetの引数にlistOf(key to value)を受け渡しましょう。

画像をダウンロードする

image_download.kt
// imageにrunBlockingの計算結果を代入
val image = runBlocking {
            val (_, _, result) = url.httpGet().awaitByteArrayResponseResult()

            // http通信に成功した場合Bitmap、失敗した場合nullがdataに入る
            val data = result.fold(
                {res-> res},
                {error->
                    Log.e(tag, "An error of type ${error.exception} happened: ${error.message}")
                    null
                }
            )
            //ここでダウンロードした画像をBitmap形式に変換する。
            BitmapFactory.decodeByteArray(data, 0, data!!.size)!!
        }

敢えてさっきとは色々違う書き方をしましたが、基本的な違いはawaitStringResponseResultawaitByteArrayResponseResultに変わっただけです。

参考

8
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
10