问题描述
我正在使用 SplashActivity,为我的应用准备一些数据',然后重定向到我的 MainActivity。
我在协程中执行此操作,以使用一些数据库事务。
如果我从协程内部启动 MainActivity,它会启动两次(当按下“返回”按钮时,它会关闭 MainActivity 并在后面显示第二个 MainActivity)。 如果我从协程外部启动 MainActivity,它就会工作(按下“返回”按钮时,它会关闭 MainActivity 和应用程序)
SplashActivity 的一个简单示例:
class SplashActivity : AppCompatActivity() {
private lateinit var activityScope: Coroutinescope
private lateinit var image: ImageView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_splash)
prepareApplication()
}
override fun onPause() {
activityScope.cancel()
super.onPause()
}
override fun onResume() {
super.onResume()
prepareApplication()
}
private fun prepareApplication() {
activityScope = Coroutinescope(dispatchers.Main)
activityScope.launch {
// This starts the MainActivity twice
startActivity(Intent(this@SplashActivity,MainActivity::class.java))
finish()
}
// This starts the MainActivity once
// startActivity(Intent(this@SplashActivity,MainActivity::class.java))
// finish()
}
}
你知道为什么以及如何避免这种情况吗?
谢谢!
解决方法
您从 onCreate 和 onResume 调用此函数,由于启动不会立即执行,因此 startActivity
调用都添加到主线程队列中。在第二种情况下,当您不使用 launch 时,它会立即执行,因此不会发生第二次调用。