ViewModel.OnCleared()
当应用程序进入后台(即使已启用)时没有被调用时,我偶然发现了一个问题,Don't keep activities
但我可以看到它Fragment.onDestroy()
实际上被调用了。
以下代码可能有什么问题?ViewModel.OnCleared()
在这种情况下,我如何才能真正被调用?
视图模型:
class ViewModelFirst(application: Application) : AndroidViewModel(application) {
companion object {
private const val TAG = "ViewModelFirst"
}
init {
Log.v(TAG, "Created")
}
override fun onCleared() {
super.onCleared()
Log.v(TAG, "onCleared")
}
}
分段:
class FragmentFirst : Fragment() {
companion object {
private const val TAG = "FragmentFirst"
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
ViewModelProviders.of(this).get(ViewModelFirst::class.java)
return inflater.inflate(R.layout.fragment_first, container, false)
}
override fun onDestroy() {
super.onDestroy()
Log.v(TAG, "onDestroy")
}
}
活动:
class MainActivity : AppCompatActivity() {
companion object {
private const val TAG = "MainActivity"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
if (savedInstanceState == null) {
supportFragmentManager.beginTransaction().replace(R.id.container, FragmentFirst()).commit()
}
}
override fun onDestroy() {
super.onDestroy()
Log.v(TAG, "onDestroy")
}
}
自己回答:
这是 com.android.support:appcompat-v7:27.1.0 的错误
如果我使用以下依赖项,我会遇到此问题:
implementation 'com.android.support:appcompat-v7:27.1.0'
implementation "android.arch.lifecycle:extensions:1.1.0"
如果我更改appcompat-v7
27.1.0 -> 27.0.2的版本,则按ViewModel.OnCleared()
预期工作(当应用程序进入后台时我会调用)。
appcompat-v7:28.0.0-alpha1
也可以,看起来这只是一个问题appcompat-v7:27.1.0
更新(2018 年 6 月)
正如@Akshay 所说,该错误已在 27.1.1 上修复。但不幸的是,并不完全。
以下场景仍未解决:
- 已
Don't keep activities
启用。 - 启动应用程序。
- 按下主页按钮。
在 27.0.2 上,我在 logcat 有以下输出:
V/ViewModelFirst: Created
V/ViewModelFirst: onCleared
V/FragmentFirst: onDestroy
V/MainActivity: onDestroy
这完全正确。
但是在27.1.1 到 28.0.0-alpha3上,我在 logcat 有以下输出:
V/ViewModelFirst: Created
V/FragmentFirst: onDestroy
V/MainActivity: onDestroy
正如我们所见,活动和片段已被销毁,但未使用 onCleared 通知 viewModel。
我怀疑如果Don't keep activities
将被禁用并且后台的应用程序将在某个时刻被 Android 自然卸载(由于另一个应用程序要求大量资源),那么viewModel.onCleared()
将不会被调用,这是非常可悲的。
PS我在这里推送了代码:https ://github.com/allco/onClearedInvestigation
并已在此处向 Google 报告此问题:https ://issuetracker.google.com/issues/110285295
更新(2018 年 8 月)
28.0.0-rc01 解决了这个问题。耶!