返回

ViewModel旋转屏幕保持存在策略

Android

ViewModel:Android 应用中的数据管理神器

概述

ViewModel 是 Android 中一种强大的类,用于管理与 UI 相关的数据。与 Activity 和 Fragment 不同,ViewModel 在这些组件的生命周期之外存在,这意味着当 Activity 或 Fragment 被销毁时,ViewModel 不会被销毁。这使得它非常适合存储跨生命周期的数据,例如表单数据或网络请求结果。

创建 ViewModel

创建 ViewModel 有多种方法:

  • 使用 ViewModelProviders.of() 方法: 此方法从 Activity 或 Fragment 中获取 ViewModel。
ViewModel viewModel = ViewModelProviders.of(this).get(ViewModelClass.class);
  • 使用 AndroidViewModelFactory: 此类允许您使用自定义参数创建 ViewModel。
ViewModelFactory factory = new AndroidViewModelFactory(getApplication());
ViewModel viewModel = ViewModelProviders.of(this, factory).get(ViewModelClass.class);
  • 使用 @Inject 注解: Dagger 库可以使用此注解将 ViewModel 注入到依赖项中。
@Inject
ViewModel viewModel;

获取 ViewModel

在 Activity 或 Fragment 中获取 ViewModel 的方法与创建 ViewModel 的方法类似:

  • 使用 ViewModelProviders.of() 方法: 此方法从 Activity 或 Fragment 中获取 ViewModel。
ViewModel viewModel = ViewModelProviders.of(this).get(ViewModelClass.class);
  • 使用 AndroidViewModelFactory: 此类允许您使用自定义参数创建 ViewModel。
ViewModelFactory factory = new AndroidViewModelFactory(getApplication());
ViewModel viewModel = ViewModelProviders.of(this, factory).get(ViewModelClass.class);
  • 使用 @Inject 注解: Dagger 库可以使用此注解将 ViewModel 注入到依赖项中。
@Inject
ViewModel viewModel;

保存 ViewModel

虽然 ViewModel 在 Activity 或 Fragment 被销毁时不会被销毁,但在某些情况下您可能仍需要保存它,例如当用户离开应用程序时。有以下几种方法可以保存 ViewModel:

  • 使用 SharedPreferences: SharedPreferences 允许您将数据存储在本地存储中。
SharedPreferences prefs = getSharedPreferences("ViewModelData", MODE_PRIVATE);
prefs.edit().putString("key", viewModel.getData()).apply();
  • 使用 Room: Room 是一个数据库库,允许您将数据存储在数据库中。
@Entity
public class ViewModelData {
    @PrimaryKey
    public int id;
    public String data;
}

@Dao
public interface ViewModelDataDao {
    @Insert
    void insert(ViewModelData data);

    @Query("SELECT * FROM ViewModelData WHERE id = :id")
    ViewModelData get(int id);
}

@Database(entities = {ViewModelData.class}, version = 1)
public abstract class ViewModelDatabase extends RoomDatabase {
    public abstract ViewModelDataDao getDao();
}

ViewModelDatabase database = Room.databaseBuilder(this, ViewModelDatabase.class, "ViewModelData").build();
ViewModelDataDao dao = database.getDao();

dao.insert(new ViewModelData(1, viewModel.getData()));
  • 使用 Bundle: Bundle 允许您在不同的 Activity 或 Fragment 之间传递数据。
Bundle bundle = new Bundle();
bundle.putString("key", viewModel.getData());
startActivity(new Intent(this, NewActivity.class).putExtras(bundle));

总结

ViewModel 是一种非常有用的工具,可以帮助您构建健壮且稳定的 Android 应用程序。通过使用 ViewModel,您可以存储跨生命周期的数据,避免在 Activity 或 Fragment 被销毁时丢失数据。

常见问题解答

  1. ViewModel 与 SavedInstanceState 有什么区别?

SavedInstanceState 仅在 Activity 或 Fragment 被销毁并重建时保留数据,而 ViewModel 在整个生命周期中都保留数据,包括旋转和配置更改。

  1. 如何处理 ViewModel 依赖关系?

ViewModel 依赖项可以像任何其他 Android 依赖项一样处理,例如使用依赖项注入库(如 Dagger)。

  1. ViewModel 是否比 Live Data 更好?

ViewModel 和 Live Data 是互补的,ViewModel 用于管理数据,而 Live Data 用于观察数据变化。

  1. ViewModel 如何应对内存泄漏?

ViewModel 通过使用依赖项注入来处理内存泄漏,并且通常只通过弱引用持有时序观察者。

  1. 何时使用 ViewModel?

ViewModel 非常适合存储跨生命周期的数据,例如表单数据、网络请求结果和用户偏好设置。