我想在实例化phoneViewModel和ScanViewModel时打开一个新的活动。它们是通过调用异步函数InitialRead()实例化的。我正在记录每个步骤,他们以done3 => done2 => done1的身份登录
我希望它们按以下顺序排列: done1 => done2 => done3
我有以下代码:
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)
}
}}
我做错了什么?有人能纠正我的代码吗?
发布于 2020-10-22 02:25:34
永远不要在安卓应用程序中使用runBlocking。runBlocking完全违背了使用协程的目的,并且可能导致ANR。您也可能永远不应该使用GlobalScope,这会导致UI泄漏。您可能需要将它用于某种长期运行的任务,这些任务放在服务中没有意义,但又不依赖于任何UI组件,但我想不出任何示例
你也不应该在后台实例化ViewModels。这应该在onCreate()中完成。
将此函数设置为挂起函数,它可以在返回前在后台同时分解两个任务。
从lifecycleScope开始你的协程。
假设sapServiceManager?.openODataStore是一个接受回调的异步任务,您需要将它包装在suspendCoroutine中。
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)
}
}https://stackoverflow.com/questions/64469210
复制相似问题