在 Compose 中获取 android.os.Handler 消息回调

问题描述 投票:0回答:1

我想要在撰写中处理处理程序消息回调事件的回调。

我正在使用 ProduceState 但有时它无法正确获取值

建议我在撰写中使用此方法的最佳方法

produceState(initialValue = 0) {
        val handler = Handler(Looper.getMainLooper()) { msg ->
            value = msg.what
            false
        }
    }

请帮助我提前谢谢你。

android kotlin android-jetpack-compose android-jetpack compose-recomposition
1个回答
0
投票

直接在 Jetpack Compose 中的 ProduceState 中使用 Handler 和 Looper 进行消息回调并不是最惯用的方法,特别是考虑到 Compose 对状态和重组的强调。在 Compose 中有更好的方法来处理异步更新,通常使用 State 和 CoroutineScope。

让我建议一种使用 LaunchedEffect 和 CoroutineScope 的更适合 Compose 的方法。如果您尝试侦听某些异步事件并将其结果反映在 Compose UI 中,则可以使用 MutableState 变量并在协程中更新它:

@Composable
fun MyComposable() {
val myState = remember { mutableStateOf(0) }

LaunchedEffect(Unit) {
    val handler = Handler(Looper.getMainLooper()) { msg ->
        myState.value = msg.what
        false
    }

    // Set up your message sending logic or listener that uses this handler
    // For example, someExternalClass.setHandler(handler)
  }

// Use myState.value in your UI
Text("Current value: ${myState.value}")
}

在此示例中:

  1. LaunchedEffect 用于初始化处理程序。 LaunchedEffect 块将在可组合项进入组合时运行,并且除非其键(在本例中为 Unit)发生更改,否则不会重新运行。这是初始化处理程序或侦听器的好地方。
  2. myState 是一个保存当前状态的 MutableState 变量。 当处理程序收到消息时,它会更新 myState。
  3. UI 对 myState 中的更改做出反应并相应地重新组合。

这种方法更符合 Jetpack Compose 的响应式本质。 它确保您的可组合项在状态更改时重新组合并更新 UI。但是,请记住,对于传统 Android 开发来说,使用 Handler 和 Looper 更为常见,并且在许多情况下,可能有更现代的方法可用,特别是在使用 Kotlin 协程或 Flow 时。

确保在可组合项离开组合的情况下进行清理(例如,删除回调或侦听器),以避免内存泄漏或不需要的行为。 这可以在 LaunchedEffect 块中通过添加在块末尾返回的 lambda 形式的清理操作来完成。

© www.soinside.com 2019 - 2024. All rights reserved.