编程语言
首页 > 编程语言> > 使用Kotlin 1.3迁移到Android中的Kotlin协同程序

使用Kotlin 1.3迁移到Android中的Kotlin协同程序

作者:互联网

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

关于我的build.gradle中的协同程序的片段

实现“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"
    }
}

在代码更改中启动GlobalScope.launch(Dispatchers.IO)或GlobalScope.launch(Dispatchers.Main).

UPDATE

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

对于活动

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

实施CoroutineScope:

class YourActivity : AppCompatActivity(), CoroutineScope {

添加本地变量作业并初始化它:

private lateinit var job: Job

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

    job = Job()
}

创建一个协程上下文并在Activity destroy上取消它:

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

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

对于Fragment(与Activity中相同)

实施CoroutineScope:

class YourFragment : Fragment(), CoroutineScope {

创建一个局部变量作业并在onCreate()中初始化它. (我尝试编写私有val作业:Job = Job(),但遇到问题,在ViewPager中你将创建Fragments及其作业.因为我们将在ViewPager中滑动期间取消onDestroy()中的作业,我们应该重新创建作业).

private lateinit var job: Job

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

    ...
    job = Job()
}

创建一个协程上下文并在Fragment destroy上取消它:

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

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

一个发布的例子

像往常一样使用启动:

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请求时出现问题.尚未调用回调内部的启动内部.所以我用交互者重新编写了代码.

标签:android,kotlin,kotlinx-coroutines
来源: https://codeday.me/bug/20190929/1830675.html