gpt4 book ai didi

android - 使用 Kotlin 1.3 在 Android 中迁移到 Kotlin 协程

转载 作者:IT老高 更新时间:2023-10-28 13:35:30 26 4
gpt4 key购买 nike

我应该在我的 build.gradle 文件中更改什么或导入类以在我的带有 Kotlin 1.3 的 Android 项目中使用稳定的协程函数?

我的 build.gradle

中关于协程的 fragment

实现“org.jetbrains.kotlin:kotlin-coroutines-core:$coroutines_version”
实现“org.jetbrains.kotlin:kotlin-coroutines-android:$coroutines_version”

当然我用的是Android Studio 3.3 Preview

最佳答案

build.gradle 中将库更改为

实现 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.1'.

删除,如果已添加:

kotlin {
experimental {
coroutines "enable"
}
}

在代码中将 launch 更改为 GlobalScope.launch(Dispatchers.IO)GlobalScope.launch(Dispatchers.Main)

更新

请使用本地协程上下文而不是全局范围(例如,参见 http://kotlinlang.org/docs/reference/coroutines/coroutine-context-and-dispatchers.html)。

对于 Activity

https://github.com/Kotlin/kotlinx.coroutines/blob/master/ui/coroutines-guide-ui.md .

实现CoroutineScope:

class YourActivity : AppCompatActivity(), CoroutineScope {

添加一个局部变量job并初始化:

private lateinit var job: Job

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

job = Job()
}

创建协程上下文并在 Activity 销毁时将其取消:

override fun onDestroy() {
job.cancel()
super.onDestroy()
}

override val coroutineContext: CoroutineContext
get() = Dispatchers.Main + job

Fragment(同Activity)

实现 CoroutineScope:

class YourFragment : Fragment(), CoroutineScope {

创建一个局部变量job并在onCreate()中对其进行初始化。 (我尝试编写 private val job: Job = Job(),但遇到了问题,即在 ViewPager 中您将创建 Fragment 及其因为我们会在 ViewPager 中滑动时取消 onDestroy() 中的 job,所以我们应该重新创建作业。

private lateinit var job: Job

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

...
job = Job()
}

创建协程上下文并在 Fragment 销毁时将其取消:

override val coroutineContext: CoroutineContext
get() = Dispatchers.Main + job // You can use different variants here.

override fun onDestroy() {
job.cancel()
super.onDestroy()
}

启动示例

像往常一样使用launch:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
launch {
// Wait for result of I/O operation without blocking the main thread.
withContext(Dispatchers.IO) {
interactor.getCountry().let {
countryName = it.name
}
}

// Update views in the UI thread.
country.updateCaption(countryName)
}
}

在我的例子中,当我使用带有常规回调的 API 请求时出现了问题。尚未调用回调内部的 launch 内部。所以我用交互器重写了那个代码。

关于android - 使用 Kotlin 1.3 在 Android 中迁移到 Kotlin 协程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52977239/

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