gpt4 book ai didi

android - 在Activity/Fragment中,如何获取/等待ViewModel协程操作的返回值?

转载 作者:行者123 更新时间:2023-12-02 10:14:08 25 4
gpt4 key购买 nike

根据 Google (link) 的 Codelab 演示,我尝试将代码重构为 ViewModel + 协程。我的问题是,我不想只插入数据( original code ),而是想等待插入操作的结果,如果插入成功,则应返回 id,然后根据结果执行某些操作。那么该怎么做呢?

目前,我将一个方法作为回调发送到 ViewModel 插入方法。当然,观察 ViewModel 是另一种选择。但还有更好的解决办法吗?

我当前的代码:

事件 Activity :

viewModel.insert(Event("name"), {
if (it == -1L) {
Log.i("insert", "failure")
} else {
Log.i("insert", "success: $it")
}
})

事件 View 模型:

private val mEventDao: EventDao = AppDatabase.getDatabase(application).eventDao()
private val mJob = Job()
private val mScope = CoroutineScope(Dispatchers.Main + mJob)

fun insert(event: Event, callback: (id: Long) -> Unit) {
mScope.launch(Dispatchers.IO) {
val result =
try {
// just for testing delay situation
delay(5000)
val id = mEventDao.insertEvent(event)
id
} catch (e: Exception) {
-1L
}
withContext(Dispatchers.Main) {
callback(result)
}
}
}

EventDao:

@Dao
interface EventDao {
fun insertEvent(event: Event): Long
}

最佳答案

您可以将 LiveData 对象添加到 EventViewModel,插入完成后更新它并在 Activity 中订阅它:

class EventViewModel : ViewModel() {
//...
var insertionId = MutableLiveData<Long>()

fun insert(event: String) {
mScope.launch(Dispatchers.IO) {
val result =
try {
// just for testing delay situation
delay(5000)
val id = mEventDao.insertEvent(event)
id
} catch (e: Exception) {
-1L
}

insertionId.postValue(result)
}
}
}

并在EventActivity中订阅:

class EventActivity : AppCompatActivity() {

lateinit var viewModel: EventViewModel

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

viewModel = ViewModelProviders.of(this).get(EventViewModel::class.java)
viewModel.insertionId.observe(this, android.arch.lifecycle.Observer { id ->
// Use `id` for example to update UI.
})

// ...

viewModel.insert(Event("name"))
}
}

关于android - 在Activity/Fragment中,如何获取/等待ViewModel协程操作的返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54387843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com