问题描述
我正在观看此视频以使用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()
}
这将按预期工作,没有任何线程问题。