如何解决Kotlin协程中的暂停功能问题
我正在观看此视频以使用Kotlin协程:https://www.youtube.com/watch?v=BOHK_w09pVA&t=1326s ,在视频中的9:30。 但是当我编写类似的代码时,它的行为却不符合我的预期:
WalletDao.kt
interface WalletDao {
@Query("SELECT * FROM wallet LIMIT 1")
suspend fun getFirstWallet(): Wallet
}
Repository.kt
class Repository private constructor(appContext: Context) {
private val appDatabase = AppDatabase.getInstance(appContext)
//current wallet
private var _currentWallet : MutableLiveData<Wallet> = MutableLiveData()
var currentWallet : LiveData<Wallet> = _currentWallet
suspend fun initFirstWallet()
{
val fW = withContext(Dispatchers.IO)
{
appDatabase.walletDao.getFirstWallet()
}
_currentWallet.value = fW
}
}
MainViewModel.kt
class MainActivityViewModel(private val repository: Repository) : ViewModel()
{
var currentWallet: LiveData<Wallet> = repository.currentWallet
init {
viewModelScope.launch {
repository.initFirstWallet()
}
}
}
MainActivity.kt
class MainActivity : AppCompatActivity() {
private lateinit var viewModel: MainActivityViewModel
private fun registerObservers() {
...
viewModel.currentWallet.observe(this)
{
if (it != null) {
binding.walletName.text = it.name
binding.walletBalance.text = it.amount.toString()
viewModel.onCurrentWalletChange()
}
}
}
}
当我在MainActivity中运行代码时,有时会调用viewModel.currentWallet的lambda并显示当前钱包的名称,但在大多数情况下不会被调用。 我已将代码更改为以下内容,但未更改:
Repository.kt
class Repository private constructor(appContext: Context) {
suspend fun initFirstWallet()
{
withContext(Dispatchers.IO)
{
_currentWallet.postValue(appDatabase.walletDao.getFirstWallet())
}
}
}
您能告诉我上述代码有什么问题吗???非常感谢!
解决方法
您无需为此使用协程。
WalletDao.kt
dataColumns = ['Name','Data',{role: 'style'},{role: 'annotation'}]
Repository.kt
interface WalletDao {
@Query("SELECT * FROM wallet LIMIT 1")
fun getFirstWallet(): LiveData<Wallet>
}
MainActivityViewModel.kt
class Repository private constructor(appContext: Context) {
private val appDatabase = AppDatabase.getInstance(appContext)
fun initFirstWallet() = appDatabase.walletDao.getFirstWallet()
}
这将按预期工作,没有任何线程问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。