gpt4 book ai didi

android - onCleared 未在 Fragment 的附加 ViewModel 上调用

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:35:28 25 4
gpt4 key购买 nike

当应用程序进入后台时未调用 ViewModel.OnCleared() 时我偶然发现了一个问题(即使启用了 Don't keep activities)但是我可以看到实际上正在调用 Fragment.onDestroy()

以下代码可能有什么问题?如何让 ViewModel.OnCleared() 在这种情况下被实际调用?

View 模型:

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")
}
}

fragment :

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")
}
}

Activity :

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 上修复。但并不完全不幸。

以下情况仍未解决:

  1. 启用Don't keep activities
  2. 启动应用程序。
  3. 按下主页按钮。

在 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

正如我们所看到的,activity 和 fragment 被销毁了,但是 viewModel 没有收到 onCleared 通知。

我怀疑如果 Don't keep activities 将被禁用并且后台的应用程序将在某个时刻自然地被 Android 卸载(由于另一个应用程序要求大量资源)很遗憾 viewModel.onCleared() 不会被调用。

附言我已将代码推送到此处:https://github.com/allco/onClearedInvestigation

并已在此处向 Google 报告此问题:https://issuetracker.google.com/issues/110285295

更新(2018 年 8 月)

28.0.0-rc01 解决了这个问题。耶!

最佳答案

这是支持库 v27.1.0 中的一个问题,已在支持库 v27.1.1 中修复。

之前在 https://issuetracker.google.com/issues/74139250 报告了一个错误.

有关详细信息,请参阅此链接:https://developer.android.com/topic/libraries/support-library/revisions

关于android - onCleared 未在 Fragment 的附加 ViewModel 上调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49257197/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com