【发布时间】:2023-01-11 20:12:22
【问题描述】:
我正在开发一个安卓应用程序,它是一个使用 Jetpack Compose 的比特币钱包。
我有钱包.kt文件:
fun sync() {
Log.i(TAG, "Wallet is syncing")
wallet.sync(blockchain, LogProgress)
}
fun getBalance(): ULong = wallet.getBalance().total
然后在 HomeScreen.kt 我有
internal class WalletViewModel() : ViewModel() {
private var _balance: MutableLiveData<ULong> = MutableLiveData(0u)
val balance: LiveData<ULong>
get() = _balance
fun updateBalance() {
Wallet.sync()
_balance.value = Wallet.getBalance()
}
然后在这之外是可组合函数 HomeScreen
internal fun HomeScreen(
navController: NavController,
walletViewModel: WalletViewModel = viewModel()
) {
val balance by walletViewModel.balance.observeAsState()
Image(Modifier.clickable{ walletViewModel.updateBalance() }
}
我的问题是当我点击可点击的图像时,整个应用程序冻结,直到 updateBalance() 完成。 我了解到这是因为同步()Wallet.kt 文件中的函数在主线程上执行网络任务,应用程序在主线程中,因此整个应用程序必须等到同步完成。
你能建议我应该如何实现协程或不同的方式,以便同步发生在后台线程内,然后将 _balance 更新到/在 Main 中吗?
我已经尝试了很多东西,包括在 viewModelScope 中的 sync() 之前挂起和异步,但似乎没有任何效果是我想要的。
谢谢
【问题讨论】:
标签: multithreading android-jetpack-compose kotlin-coroutines