前人未踏の領域へ Androidアプリ開発編

Androidアプリ開発に関する調査メモ置き場。古い記事にはアプリ以外も含まれます。

suspend関数を処理可能なラムダパラメータを定義する

タイトルも本文も何言ってるか分からないかもしれないけれどちょっと感動したので。

課題

ViewModel内の関数で、コルーチン内部でラムダを実行させたい。 このラムダは内部でRetrofitによるsuspend関数のAPI呼び出しを行うためsuspend関数の実行が必要である。どうすればよいか。

対応

ラムダをsuspend関数化したパラメータとして受け取るようにする。

// 共通のレスポンスを返すAPIを扱う関数
fun doQuery(text:String, query: suspend (id:Int) -> Response) {
    viewModelScope.launch {

        // 共通の前処理

        // APIを実行
        val response = query(id)
        
        // 以下、responseを使った共通処理
    }
}

呼び出し側(1)

   doQuery("ほげ") { id ->
         repository.getHogeItems(id)
   }

呼び出し側(2)

   doQuery("ふが") { id ->
         repository.getFugaItems(id)
   }

query: suspend (id:Int) -> Response) がポイント。 ラムダ定義のとこに suspend つけてあげるとそれがsuspend関数になる。 いや〜、Kotlin便利だわ。