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()
}

这将按预期工作,没有任何线程问题。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...