🧈

Coroutinesを理解したい②

2023/12/02に公開

Overview

前回の続きからやっていきます。
https://zenn.dev/joo_hashi/articles/d4d9e4a0df25f1

https://kotlinlang.org/docs/coroutines-basics.html#extract-function-refactoring

launch { ... } 内のコード ブロックを別の関数に抽出してみましょう。 このコードに対して「関数の抽出」リファクタリングを実行すると、suspend 修飾子を持つ新しい関数が得られます。 これは最初の一時停止関数です。 一時停止関数は通常の関数と同じようにコルーチン内で使用できますが、追加の機能として、他の一時停止関数 (この例では遅延など) を使用してコルーチンの実行を一時停止できることです。

import kotlinx.coroutines.*

fun main() = runBlocking { // これは、コルーチンスコープです
    launch { doWorld() }// 新しいコルーチンをバックグラウンドで開始し、続行
    println("Hello")
}

// これはあなたのはじめてのsuspend関数です
suspend fun doWorld() {
    delay(1000L)
    println("World!")
}

summary

suspendについて

suspend は、現在のコルーチンの実行を一時停止し、すべてのローカル変数を保存します。

suspend 関数は、他の suspend 関数から、または、launch などのコルーチン ビルダーを使って新しいコルーチンを開始することによってのみ呼び出せます。

https://developer.android.com/kotlin/coroutines/coroutines-adv?hl=ja

thoughts

Jetpack ComposeでローカルDBのRoomを使用したときに、suspendというキーワードが出てきたのですが、現在のコルーチンの実行を一時停止し、すべてのローカル変数を保存していたんですね。

DAOでも使っている

DAOと呼ばれている箇所でも使っていましたね。ここはSQLを実行していて、DBを操作するようですね。インターフェースだから、外部と接続する役割があるようですね。

package com.example.libraryapp.room

import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.Query
import androidx.room.Update
import kotlinx.coroutines.flow.Flow

@Dao
interface BookDAO {

    @Insert
    suspend fun addBook(bookEntity: BookEntity)

    @Query("SELECT * FROM BookEntity")
    fun getAllBooks(): Flow<List<BookEntity>>

    @Delete
    suspend fun deleteBook(bookEntity: BookEntity)

    @Update
    suspend fun updateBook(bookEntity: BookEntity)

}

📦レポジトリのコード

レポジトリで使っていました。ここでは、DAOを呼び出して、ロジックを実行してます。

package com.example.libraryapp.repository

import com.example.libraryapp.room.BookEntity
import com.example.libraryapp.room.BooksDB

class Repository(val booksDB: BooksDB) {

    suspend fun addBookToRoom(bookEntity: BookEntity) {
        booksDB.bookDAO().addBook(bookEntity)
    }

    fun getAllBooks() = booksDB.bookDAO().getAllBooks()

    suspend fun deleteBookFromRoom(bookEntity: BookEntity){
        booksDB.bookDAO().deleteBook(bookEntity = bookEntity)
    }

    suspend fun updateBook(bookEntity: BookEntity){
        booksDB.bookDAO().updateBook(bookEntity = bookEntity)
    }

}

https://github.com/sakurakotubaki/RoomDatabase

Discussion