简单的封装一个 主线程 和子线程 的调用
时间: 2024-02-16 20:04:38 浏览: 26
在 Kotlin 中,我们可以通过函数封装的方式来简化在主线程和子线程之间的切换。下面是一个简单的示例:
```kotlin
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
/**
* 在子线程中执行耗时任务,然后在主线程中进行 UI 更新。
*
* @param block 耗时任务的执行代码块。
* @param uiBlock UI 更新的执行代码块。
*/
fun runOnIoThenMain(block: suspend () -> Any?, uiBlock: (result: Any?) -> Unit) {
GlobalScope.launch(Dispatchers.IO) {
// 在子线程中执行耗时任务
val result = block()
// 切换到主线程更新 UI
withContext(Dispatchers.Main) {
uiBlock(result)
}
}
}
```
在上面的代码中,我们封装了一个名为 `runOnIoThenMain` 的函数。该函数接受两个参数:一个是耗时任务的代码块 `block`,另一个是 UI 更新的代码块 `uiBlock`。在函数内部,我们使用 `GlobalScope.launch` 创建一个协程,并指定了 `Dispatchers.IO` 作为协程的上下文。在协程中执行耗时任务后,我们使用 `withContext(Dispatchers.Main)` 切换到主线程进行 UI 更新。
使用该函数的示例代码如下所示:
```kotlin
// 在子线程中执行网络请求,然后在主线程中更新 UI
runOnIoThenMain({
doNetworkRequest()
}, { result ->
updateUI(result)
})
```
在上面的代码中,我们将网络请求的代码块 `doNetworkRequest` 作为 `block` 参数传递给了 `runOnIoThenMain` 函数,将 UI 更新的代码块 `updateUI` 作为 `uiBlock` 参数传递给了该函数。函数内部会在子线程中执行 `doNetworkRequest`,然后在主线程中执行 `updateUI`。