如何将已废弃的AsyncTask迁移为Kotlin协程?BookRepository重构方法
从AsyncTask迁移到Kotlin协程:BookRepository重构指南
步骤1:先调整BookDao(前提准备)
Room从2.1.0版本开始原生支持Kotlin协程,需要先把Dao中的增删改方法声明为suspend函数,确保数据库操作能在协程中执行:
@Dao interface BookDao { // 原有LiveData查询方法保持不变 @Query("SELECT * FROM book_table ORDER BY book_name ASC") fun allBooks(): LiveData<List<Book>> @Query("SELECT * FROM book_table WHERE book_name LIKE :searchQuery OR author_name LIKE :searchQuery") fun getBooksByBookOrAuthor(searchQuery: String): LiveData<List<Book>> // 将增删改改为suspend函数 @Insert suspend fun insert(book: Book) @Update suspend fun update(book: Book) @Delete suspend fun delete(book: Book) }
步骤2:重构BookRepository
移除所有AsyncTask相关代码,用协程替代异步操作:
package com.room.ps.bookkeeper import android.app.Application import androidx.liveData import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext class BookRepository(application: Application) { val allBooks: LiveData<List<Book>> private val bookDao: BookDao init { val bookDb = BookRoomDatabase.getDatabase(application) bookDao = bookDb!!.bookDao() allBooks = bookDao.allBooks() } fun getBooksByBookOrAuthor(searchQuery: String): LiveData<List<Book>>? { return bookDao.getBooksByBookOrAuthor("%$searchQuery%") // 注意如果是模糊查询,需补全通配符 } suspend fun insert(book: Book) { withContext(Dispatchers.IO) { bookDao.insert(book) } } suspend fun update(book: Book) { withContext(Dispatchers.IO) { bookDao.update(book) } } suspend fun delete(book: Book) { withContext(Dispatchers.IO) { bookDao.delete(book) } } }
核心变化说明
- 移除冗余代码:删除了
InsertAsyncTask、UpdateAsyncTask、DeleteAsyncTask三个内部类,以及AsyncTask、Executors的无用导入。 - 协程调度优化:用
withContext(Dispatchers.IO)将数据库操作切换到IO线程,这是协程处理IO密集型任务的标准方式,替代AsyncTask的doInBackground逻辑。 - 代码简化:增删改方法直接调用Dao的
suspend函数,逻辑更直观,异常处理也更灵活(可在调用处通过try-catch捕获)。 - LiveData逻辑保留:查询返回LiveData的方法无需修改,Room会自动在后台执行查询并将结果发布到主线程。
必要依赖检查
确保项目已添加协程和Room的Kotlin扩展依赖(Module级build.gradle):
dependencies { // Kotlin协程核心库 implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3" // Android平台协程适配库 implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3" // Room核心库(版本≥2.1.0) implementation "androidx.room:room-runtime:2.5.0" kapt "androidx.room:room-compiler:2.5.0" // Room Kotlin扩展,支持协程 implementation "androidx.room:room-ktx:2.5.0" }
内容的提问来源于stack exchange,提问作者Kaleab Woldemariam
相关产品推荐
相关产品推荐

