11

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-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

这完全正确。

但是在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 解决了这个问题。耶!

4

1 回答 1

7

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

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

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

于 2018-03-21T16:14:40.573 回答