AndroidViewModel 与 ViewModel

作者:编程家 分类: android 时间:2025-10-29

AndroidViewModel 与 ViewModel 是 Android Jetpack 架构组件中的两个重要类,用于帮助开发者更好地管理和处理 Android 应用程序的界面数据和状态。它们被设计成与界面相关的数据模型,能够在设备旋转或配置更改等情况下保持数据的一致性,同时提供了与后台逻辑的解耦。本文将介绍 AndroidViewModel 与 ViewModel 的基本概念和用法,并通过一个案例代码来说明它们的实际应用。

AndroidViewModel

AndroidViewModel 是 ViewModel 的一个子类,它专门用于处理与界面相关的数据。与普通的 ViewModel 不同,AndroidViewModel 可以接收一个 Application 对象作为参数,在其中可以访问到应用程序的全局状态和资源。AndroidViewModel 的一个重要作用是将数据与界面的生命周期绑定以防止数据丢失或重复加载的问题。

下面是一个简单的例子,演示了如何在 AndroidViewModel 中保存和更新数据:

java

public 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 子类。它包含一个类型为 MutableLiveData 的数据成员 mData,用于保存界面数据。通过 getData() 方法可以获取 mData 的 LiveData 对象,以便在界面上观察数据的变化。而 updateData() 方法则用于更新 mData 的值。

ViewModel

ViewModel 是 Jetpack 架构组件中的另一个重要类,它用于存储和管理与界面相关的数据和状态。ViewModel 的一个关键特点是它的生命周期与界面的生命周期无关,即使界面被销毁和重新创建,ViewModel 仍然存在,可以保持数据的一致性。

下面是一个简单的例子,演示了如何使用 ViewModel 来处理屏幕旋转时的数据保存和恢复:

java

public 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 相关的依赖:

groovy

implementation "android.arch.lifecycle:viewmodel:1.1.1"

然后,在 Activity 或 Fragment 中,使用 ViewModelProviders 来获取 ViewModel 实例:

java

MyViewModel viewModel = ViewModelProviders.of(this).get(MyViewModel.class);

通过这种方式,我们可以确保每个界面组件都使用同一个 ViewModel 实例,以便保持数据的一致性。接下来,可以使用 LiveData 的 observe() 方法来观察数据的变化,并在回调方法中更新界面。

案例代码

为了更好地理解 AndroidViewModel 和 ViewModel 的使用,我们假设有一个简单的计数器应用程序。用户可以点击按钮来增加计数器的值,并在界面上显示当前的计数值。

首先,我们需要创建一个布局文件 activity_main.xml,用于显示计数值和按钮:

xml

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

android:id="@+id/incrementButton"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Increment" />

接下来,创建一个名为 MainActivity 的 Activity 类,并在其中实现计数器的逻辑:

java

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