首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin使用协程等待异步

Kotlin使用协程等待异步
EN

Stack Overflow用户
提问于 2020-10-22 01:59:32
回答 1查看 504关注 0票数 1

我想在实例化phoneViewModel和ScanViewModel时打开一个新的活动。它们是通过调用异步函数InitialRead()实例化的。我正在记录每个步骤,他们以done3 => done2 => done1的身份登录

我希望它们按以下顺序排列: done1 => done2 => done3

我有以下代码:

代码语言:javascript
复制
class MainBusinessActivity : AppCompatActivity() {

private lateinit var scanViewModel: ScanViewModel
private lateinit var phoneViewModel: PhoneViewModel

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main_business)
}

private fun startEntitySetListActivity() = GlobalScope.async {
    val sapServiceManager = (application as SAPWizardApplication).sapServiceManager
    sapServiceManager?.openODataStore {
        phoneViewModel =  ViewModelProvider(this@MainBusinessActivity).get(PhoneViewModel::class.java).also {it.initialRead{Log.e("done", "done1")}}
        scanViewModel = ViewModelProvider(this@MainBusinessActivity).get(ScanViewModel::class.java).also {it.initialRead{Log.e("done", "done2")}}
    }
}

override fun onResume() {
    super.onResume()
    //startEntitySetListActivity()
    runBlocking {
        startEntitySetListActivity().await()
        val intent = Intent(this@MainBusinessActivity, HomeActivity::class.java)
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
        Log.e("done", "done3")
        startActivity(intent)
    }
}

}

我做错了什么?有人能纠正我的代码吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-22 02:25:34

永远不要在安卓应用程序中使用runBlockingrunBlocking完全违背了使用协程的目的,并且可能导致ANR。您也可能永远不应该使用GlobalScope,这会导致UI泄漏。您可能需要将它用于某种长期运行的任务,这些任务放在服务中没有意义,但又不依赖于任何UI组件,但我想不出任何示例

你也不应该在后台实例化ViewModels。这应该在onCreate()中完成。

将此函数设置为挂起函数,它可以在返回前在后台同时分解两个任务。

lifecycleScope开始你的协程。

假设sapServiceManager?.openODataStore是一个接受回调的异步任务,您需要将它包装在suspendCoroutine中。

代码语言:javascript
复制
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main_business)
    phoneViewModel = ViewModelProvider(this@MainBusinessActivity).get(PhoneViewModel::class.java)
    scanViewModel = ViewModelProvider(this@MainBusinessActivity).get(ScanViewModel::class.java)
}

private suspend fun startEntitySetListActivity() = coroutineScope {
    val sapServiceManager = (application as SAPWizardApplication).sapServiceManager
    sapServiceManager ?: return
    suspendCoroutine<Unit> { continuation ->
        sapServiceManager.openODataStore { continuation.resume(Unit) }
    }
    listOf(
        launch {
            phoneViewModel.initialRead{Log.e("done", "done1")}
        },
        launch {
            scanViewModel.initialRead{Log.e("done", "done2")}
        }
    ).joinAll()
}

override fun onResume() {
    super.onResume()
    lifecycleScope.launch {
        startEntitySetListActivity()
        val intent = Intent(this@MainBusinessActivity, HomeActivity::class.java)
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
        Log.e("done", "done3")
        startActivity(intent)
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64469210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档