使用协程在Roomdb中成功插入数据时,我想获取回调
MyDao.kt
@Dao
interface MyDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(obj: Task): Long
}
TaskViewModel.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)
}
}
}
如何从
mID
方法返回insertTask()
?提前谢谢你
最佳答案
用withContext
包裹调用,并将函数标记为暂停
suspend insertTask(task: Task) = withContext(Dispatchers.IO) { appDao.insertTask(task) }
从您的 Angular 来看:
fun saveTask(t: Task) = lifecycleScope.launch {
val id = viewModel.insertTask(t)
Toast.makeText(context, "Task $id has been inserted, Toast.LENGTH_SHORT).show()
}
您还可以返回一个
LiveData
,它在完成后触发回调:fun insertTask(task: Task): LiveData<Long> {
val liveData = MutableLiveData<Long>()
viewModelScope.launch {
liveData.value = dao.insertTask(task)
}
return liveData
}
进一步的建议
不要在 View 模型中保留对上下文的引用。如果需要上下文,请使用
AndroidViewModel
和AndroidViewModel#getApplication()