返回

持久化、onSaveInstanceState()、UI 状态恢复和 Loader:深入探究《第二部分》

Android

导言

在前面的博文中,我们探讨了 ViewModel 在保存和管理 UI 数据中的作用,特别是在配置更改(如屏幕旋转)的情况下。在本文的第二部分中,我们将深入了解持久化、onSaveInstanceState()、UI 状态恢复和 Loader,这些技术与 ViewModel 协同工作,以确保 Android 应用程序中无缝的用户体验。

持久化:跨越配置更改

持久化是指将数据从设备内存存储到更持久的位置(如文件系统或数据库)的过程。这对于在配置更改后保留应用程序数据至关重要。ViewModel 通过提供 onSaveInstanceState() 和 onRestoreInstanceState() 方法,支持持久化。onSaveInstanceState() 方法允许我们在配置更改之前保存 ViewModel 的状态,而 onRestoreInstanceState() 方法允许我们在更改后恢复状态。

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.putString("savedScore", score.value)
}

override fun onRestoreInstanceState(savedInstanceState: Bundle) {
    super.onRestoreInstanceState(savedInstanceState)
    val savedScore = savedInstanceState.getString("savedScore")
    if (savedScore != null) {
        score.value = savedScore
    }
}

在上面的示例中,我们使用 onSaveInstanceState() 方法将当前分数保存在 Bundle 中,并使用 onRestoreInstanceState() 方法在配置更改后恢复它。

UI 状态恢复

UI 状态恢复涉及在配置更改后重建应用程序的 UI。除了 onSaveInstanceState() 和 onRestoreInstanceState() 方法外,ViewModel 还通过 @Parcelize 注解支持 UI 状态恢复。使用该注解,我们可以将 ViewModel 的状态序列化为可恢复的状态对象。

@Parcelize
data class MyViewModel(val score: MutableLiveData<String>) : ViewModel()

通过使用 @Parcelize 注解,ViewModel 的状态可以自动保存和恢复,从而简化了 UI 状态恢复过程。

Loader:异步数据加载

Loader 是 Android 中用于执行异步数据加载的组件。它们与 ViewModel 配合使用,以便在数据加载期间保持 UI 的响应性。ViewModel 负责初始化 Loader,而 Loader 负责加载数据并将其提供给 ViewModel。

class MyViewModel : ViewModel() {

    private val loader = LoaderManager.getInstance(this).initLoader(LOADER_ID, null, object : LoaderManager.LoaderCallbacks<List<MyData>> {
        override fun onCreateLoader(id: Int, args: Bundle?) = MyDataLoader()

        override fun onLoadFinished(loader: Loader<List<MyData>>, data: List<MyData>) {
            _data.value = data
        }

        override fun onLoaderReset(loader: Loader<List<MyData>>) {}
    })
}

在上面的示例中,我们初始化一个 Loader 来加载数据。一旦数据加载完成,就会通过 LoaderCallbacks 接口将数据传递给 ViewModel。

结论

持久化、onSaveInstanceState()、UI 状态恢复和 Loader 是 Android 开发中强大的工具,可以确保应用程序在配置更改后提供无缝的用户体验。通过结合使用这些技术和 ViewModel,我们可以创建健壮且响应迅速的应用程序。

在本文的第二部分中,我们深入探讨了这些技术的原理和实现,提供了代码示例来说明其用法。通过遵循这些最佳实践,您可以提高应用程序的可靠性和用户满意度。