在build.gradle 中将库更改为
implementation '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)。
对于活动
见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 中,您将创建Fragments 和他们的工作。因为我们将在onDestroy() 中刷卡时取消jobViewPager,我们应该重新创建作业)。
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 内部。所以我用交互器重写了那个代码。