在Fragment的附加ViewModel上没有调用onCleared

Ale*_*sov 9 android android-viewmodel android-architecture-components

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")
    }
}
Run Code Online (Sandbox Code Playgroud)

分段:

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")
    }
}
Run Code Online (Sandbox Code Playgroud)

活动:

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")
    }    
}
Run Code Online (Sandbox Code Playgroud)

自己回答:

这是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"
Run Code Online (Sandbox Code Playgroud)

如果我更改了appcompat-v727.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
Run Code Online (Sandbox Code Playgroud)

哪个完全正确.

但是在27.1.1到28.0.0-alpha3我在logcat有以下输出:

V/ViewModelFirst: Created
V/FragmentFirst: onDestroy
V/MainActivity: onDestroy
Run Code Online (Sandbox Code Playgroud)

我们可以看到活动和片段被破坏但是viewModel没有被onCleared通知.

我怀疑,如果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解决了这个问题.好极了!

Aks*_*iya 7

这是Support Library v27.1.0中的一个问题,已在Support Library v27.1.1中修复.

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

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