从另一个线程访问值?Kotlin/Java

ipakzgxi  于 2023-08-06  发布在  Kotlin
关注(0)|答案(2)|浏览(128)

我正在使用Android Studio使用Kotlin编写应用程序。
我想打开一个特定的URL来检查其中的值是真还是假(SmartHome Stuff),然后更改应用程序中按钮的颜色。在主线程上执行此操作时,Kotlin会抛出android.os.NetworkOnMainThreadException。
所以我创建了一个新的线程来完成所有的URL操作,它正在工作(直到这里一切都很好)。
问题是,我需要从第二个线程获取值到我的主线程中,以更改按钮颜色。或者将按钮“获取”到第二个线程中,并在那里更改按钮的颜色。
我是一个编程新手,所以我可能不知道解决我的问题的简单方法。
先谢了

q8l4jmvw

q8l4jmvw1#

在协程中,我们使用withContext切换到后台线程(Dispatchers.IO)来处理URL请求,然后切换回主线程,使用updateButtonColor函数更新按钮颜色。`import kotlinx.coroutines. *

// Assuming you're inside an activity or a fragment
val myButton = findViewById<Button>(R.id.my_button)

// Create a coroutine scope
val coroutineScope = CoroutineScope(Dispatchers.Main)

// Function to perform the URL request and get the value (true or false)
suspend fun performURLRequest(): Boolean {
    // Perform your URL request here and return the result (true or false)
    delay(2000) // Simulating a network delay for demonstration purposes
    return true
}

// Function to update the button color based on the value
fun updateButtonColor(value: Boolean) {
    if (value) {
        myButton.setBackgroundColor(Color.GREEN)
    } else {
        myButton.setBackgroundColor(Color.RED)
    }
}

// Launch a coroutine in the main thread
coroutineScope.launch {
    // Switch to the background thread for the URL request
    val value = withContext(Dispatchers.IO) {
        performURLRequest()
    }

    // Now, switch back to the main thread to update the button color
    updateButtonColor(value)
}
`

字符串

o2gm4chl

o2gm4chl2#

@Volatile

private var flag: Boolean = false

fun toggleFlag() {

flag = !flag

}

fun performAction() {

if (flag) {

// Code execution when the flag is true

} else {

// Code execution when the flag is false

}

}

字符串
在这段代码中,flag被声明为volatile。多个线程可以调用toggleFlag()来更改它的值,performAction()使用该标志来决定采用哪个代码路径。使用volatile,我们确保一个线程所做的任何更新都能立即被其他线程看到。这就像使用一个特殊的扩音器,确保每个人都听到最新的消息。

相关问题