AndroidViewModel 与 ViewModel 是 Android Jetpack 架构组件中的两个重要类,用于帮助开发者更好地管理和处理 Android 应用程序的界面数据和状态。它们被设计成与界面相关的数据模型,能够在设备旋转或配置更改等情况下保持数据的一致性,同时提供了与后台逻辑的解耦。本文将介绍 AndroidViewModel 与 ViewModel 的基本概念和用法,并通过一个案例代码来说明它们的实际应用。
AndroidViewModelAndroidViewModel 是 ViewModel 的一个子类,它专门用于处理与界面相关的数据。与普通的 ViewModel 不同,AndroidViewModel 可以接收一个 Application 对象作为参数,在其中可以访问到应用程序的全局状态和资源。AndroidViewModel 的一个重要作用是将数据与界面的生命周期绑定以防止数据丢失或重复加载的问题。下面是一个简单的例子,演示了如何在 AndroidViewModel 中保存和更新数据:javapublic class MyViewModel extends AndroidViewModel { private MutableLiveData mData; public MyViewModel(Application application) { super(application); mData = new MutableLiveData<>(); } public LiveData getData() { return mData; } public void updateData(String newData) { mData.setValue(newData); }} 在上述代码中,我们创建了一个名为 MyViewModel 的 AndroidViewModel 子类。它包含一个类型为 MutableLiveDatajavapublic class MyViewModel extends ViewModel { private MutableLiveData mData; public MyViewModel() { mData = new MutableLiveData<>(); } public LiveData getData() { return mData; } public void updateData(String newData) { mData.setValue(newData); }} 在上述代码中,我们创建了一个名为 MyViewModel 的 ViewModel 类。它与 AndroidViewModel 的区别在于,没有接收 Application 对象的构造函数。其余部分与 AndroidViewModel 的使用方式相同。在 Android 中使用 ViewModel 和 AndroidViewModel在 Android 应用程序中使用 ViewModel 和 AndroidViewModel 非常简单。首先,我们需要在 Gradle 文件中添加 ViewModel 相关的依赖:groovyimplementation "android.arch.lifecycle:viewmodel:1.1.1"然后,在 Activity 或 Fragment 中,使用 ViewModelProviders 来获取 ViewModel 实例:
javaMyViewModel viewModel = ViewModelProviders.of(this).get(MyViewModel.class);通过这种方式,我们可以确保每个界面组件都使用同一个 ViewModel 实例,以便保持数据的一致性。接下来,可以使用 LiveData 的 observe() 方法来观察数据的变化,并在回调方法中更新界面。案例代码为了更好地理解 AndroidViewModel 和 ViewModel 的使用,我们假设有一个简单的计数器应用程序。用户可以点击按钮来增加计数器的值,并在界面上显示当前的计数值。首先,我们需要创建一个布局文件 activity_main.xml,用于显示计数值和按钮:
xml接下来,创建一个名为 MainActivity 的 Activity 类,并在其中实现计数器的逻辑:xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" tools:context=".MainActivity"> android:id="@+id/counterTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="24sp" android:text="0" />
javapublic class MainActivity extends AppCompatActivity { private MyViewModel mViewModel; private TextView mCounterTextView; private Button mIncrementButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取 ViewModel 实例 mViewModel = ViewModelProviders.of(this).get(MyViewModel.class); // 初始化界面组件 mCounterTextView = findViewById(R.id.counterTextView); mIncrementButton = findViewById(R.id.incrementButton); // 观察数据的变化 mViewModel.getData().observe(this, new Observer() { @Override public void onChanged(String value) { mCounterTextView.setText(value); } }); // 设置按钮点击事件 mIncrementButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int counter = Integer.parseInt(mViewModel.getData().getValue()); counter++; mViewModel.updateData(String.valueOf(counter)); } }); }} 在上述代码中,我们首先通过 ViewModelProviders.of(this).get(MyViewModel.class) 来获取 ViewModel 实例。然后,使用 findViewById() 方法来获取布局文件中的界面组件,并设置它们的初始值。接下来,通过 observe() 方法来观察数据的变化,并在 onChanged() 方法中更新界面。最后,设置按钮的点击事件,每次点击时更新计数器的值。通过上述代码,我们可以实现一个简单的计数器应用程序,并且能够在屏幕旋转等情况下保持计数值的一致性。这是因为 ViewModel 的存在,使得数据与界面的生命周期解耦,从而避免了数据丢失或重复加载的问题。AndroidViewModel 和 ViewModel 是 Android Jetpack 架构组件中的两个重要类,用于帮助开发者更好地管理和处理 Android 应用程序的界面数据和状态。它们的主要作用是将数据与界面的生命周期绑定以防止数据丢失或重复加载的问题。通过使用 ViewModel 和 AndroidViewModel,我们可以更好地组织和维护 Android 应用程序的代码,提高开发效率和代码质量。参考代码完整的示例代码可以在以下 GitHub 仓库中找到:[https://github.com/example/android-viewmodel-sample](https://github.com/example/android-viewmodel-sample)