【问题标题】:How to perform time-consuming operations in the background and update the UI using coroutines in Kotlin for Android development in Jetpack Compose如何在 Jetpack Compose 中使用 Kotlin 中的协程在后台执行耗时操作并更新 UI 以进行 Android 开发
【发布时间】: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


    【解决方案1】:

    您可以通过两种方式解决它,一种是将异步调用附加到 viewModelScope 并将异步调用标记为挂起,另一种是在您的存储库中使用 Context 创建一个协程并在另一个线程中执行它。

    解决方案 1

    fun updateBalance() {
      viewModelScope.launch {
        Wallet.sync()
        _balance.value = Wallet.getBalance()
       }
      }
    
    suspend fun sync() {
        Log.i(TAG, "Wallet is syncing")
        wallet.sync(blockchain, LogProgress)
    }
    

    方案二

    suspend fun sync() {
        Log.i(TAG, "Wallet is syncing")
        withContext(Dispatcher.IO) {
          wallet.sync(blockchain, LogProgress)
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-23
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      • 2021-10-07
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多