San*_*inh 3 android coroutine kotlin android-room
我想在使用协程在 Roomdb 中成功插入数据时得到回调
MyDao.kt
@Dao
interface MyDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(obj: Task): Long
}
Run Code Online (Sandbox Code Playgroud)
任务视图模型.kt
class TaskViewModel(var context:Context) : ViewModel{
private var appDao: AppDao
init {
val db = AppDatabase.getInstance(context)
appDao = db.appDao()
}
fun insertTask(tast: Task) {
GlobalScope.launch {
val mID = appDao.insert(task)
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何mID从insertTask()方法返回?
提前谢谢你
用 包装调用 withContext并将函数标记为挂起
suspend insertTask(task: Task) = withContext(Dispatchers.IO) { appDao.insertTask(task) }
Run Code Online (Sandbox Code Playgroud)
从你的角度来看:
fun saveTask(t: Task) = lifecycleScope.launch {
val id = viewModel.insertTask(t)
Toast.makeText(context, "Task $id has been inserted", Toast.LENGTH_SHORT).show()
}
Run Code Online (Sandbox Code Playgroud)
您还可以返回一个LiveData在完成时触发回调的函数:
fun insertTask(task: Task): LiveData<Long> {
val liveData = MutableLiveData<Long>()
viewModelScope.launch {
liveData.value = dao.insertTask(task)
}
return liveData
}
Run Code Online (Sandbox Code Playgroud)
进一步建议
不要在视图模型中保留对上下文的引用。如果您需要上下文使用AndroidViewModel和AndroidViewModel#getApplication()
| 归档时间: |
|
| 查看次数: |
1882 次 |
| 最近记录: |