🧈
Coroutinesを理解したい②
Overview
前回の続きからやっていきます。
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 などのコルーチン ビルダーを使って新しいコルーチンを開始することによってのみ呼び出せます。
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)
}
}
Discussion