当应用程序转到后台时(即使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
我们可以看到活动和片段被破坏但是viewModel没有被onCleared通知。
我怀疑,如果Don't keep activities
将被禁用,并且Android会自动卸载应用程序(由于另一个应用程序要求提供大量资源),{{1}不会被称为非常悲伤。
并在此向Google报告此问题:https://github.com/allco/onClearedInvestigation
更新(2018年8月)
28.0.0-rc01解决了这个问题。好极了!
答案 0 :(得分:7)
这是Support Library v27.1.0中的一个问题,已在支持库v27.1.1中修复。
以前在https://issuetracker.google.com/issues/74139250报告了一个错误。
有关详细信息,请参阅此链接:https://developer.android.com/topic/libraries/support-library/revisions