【发布时间】:2023-03-13 15:55:01
【问题描述】:
下面的 coe 只打印“onDestory”,而不是“launch”。但是,如果我像第二个块一样修改代码,则会打印“启动”。这是为什么?类成员变量在onDestroy()之前被销毁了吗?
lateinit var viewModel: ArticleViewModel;
override fun onCreate(savedInstanceState: Bundle?)
{
super.onCreate(savedInstanceState)
viewModel = ViewModelProvider(this)[ArticleViewModel::class.java];
....
override fun onDestroy()
{
super.onDestroy()
Log.d("stack", "onDestroy");
viewModel.viewModelScope.launch(Dispatchers.IO)
{
Log.d("stack", "launch");
}
}
修改
override fun onDestroy()
{
super.onDestroy()
Log.d("stack", "onDestroy");
val vm = ViewModelProvider(this)[ArticleViewModel::class.java];
vm.viewModelScope.launch(Dispatchers.IO)
{
Log.d("stack", "launch");
}
}
【问题讨论】:
-
viewmodel 范围将在 onDestroy 之后调用 onCleared,所以我认为这种方法不起作用。如果您需要在后台创建一些工作,也许您可以创建一个工作管理器来完成任务。 Viewmodel 范围 -> developer.android.com/topic/libraries/architecture/…
-
@ManuelMato 我试图将活动的状态保存到 Room 数据库中,当在主线程中调用时会引发异常。我将代码更改为
CoroutineScope(Dispatchers.IO),当活动是第二个活动时,它似乎可以工作。但是当它是主要活动时,按下后退按钮时似乎没有调用onDestory,因此没有调用我的状态保存代码。 -
因为当你按下返回按钮时,activity没有被销毁,处于onStop生命周期中。如果您想在返回时销毁活动,则需要覆盖 onBackPressed 方法并调用 finish()
-
@ManuelMato 你所说的 onStop 状态,如果你按下 HOME 按钮,将是真的(在大多数情况下)。具有单个 Activity 的简单应用程序通常会在您按下 BACK 按钮后被销毁。所有这一切都以大多数情况免责声明表示。根据系统对资源的激进程度,不同的 Android 实现的行为会有所不同。无论如何,+1 如果您实施 onBackPressed 您可以更好地控制按回时正在运行的内容。保存到数据库可能发生在 onBackPressed 内部,等待它完成然后完成活动
标签: android kotlin kotlin-coroutines