【Android】ViewModel和AndroidViewModel区别

在 Android 开发中,AndroidViewModelViewModel 都是 ViewModel 架构组件的一部分,用于在界面(如 ActivityFragment)和数据之间进行分离,以保持数据在配置更改(如屏幕旋转)时的持久性。不过,它们之间存在一些关键区别。

继承关系与构造函数

  • ViewModelViewModel 是一个抽象类,位于 androidx.lifecycle 包中。它是所有 ViewModel 类的基类,构造函数较为简单,不包含任何特定的 Android 上下文依赖。示例如下:
java 复制代码
import androidx.lifecycle.ViewModel; 
public class MyViewModel extends ViewModel { 
// 构造函数无特殊要求 
    public MyViewModel() { 
    // 初始化操作 
    } 
}
  • AndroidViewModelAndroidViewModel 继承自 ViewModel,并且在构造函数中接收 Application 上下文。这意味着它可以访问应用级别的资源,例如 Application 类的实例。示例如下:
js 复制代码
import android.app.Application; 
import androidx.lifecycle.AndroidViewModel; 
public class MyAndroidViewModel extends AndroidViewModel { 
    public MyAndroidViewModel(Application application) { 
    super(application); 
    // 可以使用 application 实例进行操作 
    } 
}
-   **ViewModel**:当 `ViewModel` 不需要访问 Android 上下文或只需要一些与上下文无关的数据和逻辑时,推荐使用 `ViewModel`。例如,处理简单的业务逻辑、数据转换等。

上下文的使用

  • ViewModel :由于 ViewModel 不持有任何 Android 上下文,所以它不适合直接访问 Android 特定的资源,如 ContextSharedPreferences 等。如果需要在 ViewModel 中执行与上下文相关的操作,应该通过依赖注入的方式将所需的资源传递给 ViewModel
  • AndroidViewModelAndroidViewModel 持有 Application 上下文,这使得它可以安全地访问应用级别的资源,例如 Application 类的实例、SharedPreferences 等。不过,需要注意的是,不应该在 AndroidViewModel 中持有 ActivityFragmentView 的引用,因为这可能会导致内存泄漏。

使用场景

  • ViewModel :当 ViewModel 不需要访问 Android 上下文或只需要一些与上下文无关的数据和逻辑时,推荐使用 ViewModel。例如,处理简单的业务逻辑、数据转换等。
java 复制代码
import androidx.lifecycle.LiveData; 
import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; 
public class CounterViewModel extends ViewModel { 
    private MutableLiveData<Integer> count = new MutableLiveData<>(0); 
    public LiveData<Integer> getCount() { 
        return count; 
    } 
    public void increment() { 
        count.setValue(count.getValue() + 1); 
    } 
}
  • AndroidViewModel :当 ViewModel 需要访问应用级别的资源时,应该使用 AndroidViewModel。例如,访问 SharedPreferences、数据库等。
typescript 复制代码
import android.app.Application; 
import androidx.lifecycle.AndroidViewModel; 
import androidx.lifecycle.LiveData; 
import androidx.lifecycle.MutableLiveData; 
import android.content.SharedPreferences; 
public class SettingsViewModel extends AndroidViewModel { 
    private SharedPreferences sharedPreferences; 
    private MutableLiveData<String> theme = new MutableLiveData<>(); 
    public SettingsViewModel(Application application) { 
    super(application); 
    sharedPreferences = application.getSharedPreferences("settings", 0); theme.setValue(sharedPreferences.getString("theme", "light")); } 
    
    public LiveData<String> getTheme() { 
        return theme; 
    } 
    
    public void setTheme(String theme) { 
        this.theme.setValue(theme)
        sharedPreferences.edit().putString("theme", theme).apply(); 
    } 
}

综上所述,ViewModel 适用于不需要 Android 上下文的场景,而 AndroidViewModel 适用于需要访问应用级资源的场景。在选择使用哪个类时,应根据具体的需求来决定。

相关推荐
Digitally20 小时前
如何将安卓手机备份到电脑?7种方法
android
火柴就是我1 天前
android:enableJetifier=true 再学习
android·flutter
杨筱毅1 天前
【Android】【底层原理】深入解析SELinux模块
android·底层机制
Tom4i1 天前
基于 Launcher3 的 iOS 风格桌面 04 拖拽和移位
android
2501_915106321 天前
iOS 反编译防护工具与实战组合 从静态侦察到 IPA 成品加固的工程化路径
android·ios·小程序·https·uni-app·iphone·webview
游戏开发爱好者81 天前
iOS 26 iPhone 使用记录分析 多工具组合构建全方位设备行为洞察体系
android·ios·小程序·uni-app·cocoa·iphone·webview
zhangphil1 天前
HARDWARE 属性的Bitmap与普通Bitmap,GPU与RenderThread渲染与处理方式异同比较,Android
android
消失的旧时光-19431 天前
Flutter 异步编程:Future 与 Stream 深度解析
android·前端·flutter
alexhilton1 天前
Compose CameraX现已稳定:给Composer的端到端指南
android·kotlin·android jetpack
阿里云云原生2 天前
移动端性能监控探索:可观测 Android 采集探针架构与实现
android