gpt4 book ai didi

android - 是否可以让 setOnClickListener block 等待其中的方法调用?

转载 作者:行者123 更新时间:2023-11-29 23:12:52 26 4
gpt4 key购买 nike

我在 setOnClickListener block 中首先有一个方法调用,它从我用来启动实时流的 API 获取一些值,这对于该方法调用至关重要,在其他任何事情之前完成在 block 内完成以获得正确的结果,因为第一行方法调用之后的所有其他内容都依赖于此。

代码 fragment :

myButton.setOnClickListener {

// Everything depends on check stream call
currentViewModel.checkStream()

if (!PlaybackService.isServiceStarted) {
if (isStreaming!!) {
onPlayerStart()
sliding_player.panelState = SlidingUpPanelLayout.PanelState.COLLAPSED
} else
Snackbar.make(appbar, R.string.stream_fail, Snackbar.LENGTH_LONG).show()
}
}

我需要 myButton.setOnClickListener block 等待
currentViewModel.checkStream() 以便下面的行能够正常工作(给出正确的结果)。

这有可能吗?使用某种回调方法?我应该考虑用 Retrofit2 来做吗?

最佳答案

您永远不应该在主线程上等待并且 onClick() 在主线程上被调用。

您可以考虑使用异步框架来处理您的用例。这些框架将包括 RxJavaAsyncTask 甚至是普通的 Handler 实现。为了更接近您的实际实现,Kotlin Coroutines 可能是最合适的,因为切换回主线程非常清晰。它还与 Retrofit 很好地集成。

myButton.setOnClickListener {
coroutineScope.launch(Dispatchers.IO) {
// make sure checkStream() is a suspending function
// to wait for it execution to finish
currentViewModel.checkStream()

if (!PlaybackService.isServiceStarted) {
launch(Dispatchers.Main) {
if (isStreaming!!) {
onPlayerStart()
sliding_player.panelState = COLLAPSED
} else {
Snackbar.make(appbar, R.string.stream_fail, LENGTH_LONG).show()
}
}
}
}
}

您必须将 coroutineScope 附加到生命周期才能不泄漏 Activity 或 fragment 。

关于android - 是否可以让 setOnClickListener block 等待其中的方法调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55791789/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com