在 Android 的 MVVM 架構中,ViewModel
和 AndroidViewModel
都是用于管理 UI 相關數據的組件,但二者有一些關鍵區別:
1. ViewModel
- 基本用途:用于存儲和管理與 UI 相關的數據,生命周期與
Activity
/Fragment
解耦(即使配置變更如屏幕旋轉,數據也不會丟失)。 - 依賴關系:不直接依賴 Android 框架(如
Context
)。 - 適用場景:適合純邏輯數據處理,不需要
Context
的情況。 - 示例代碼:
class MyViewModel : ViewModel() {private val _data = MutableLiveData<String>()val data: LiveData<String> get() = _datafun fetchData() {// 業務邏輯(無需 Context)_data.value = "Hello, ViewModel!"} }
2. AndroidViewModel
- 基本用途:繼承自
ViewModel
,但內部持有Application
上下文(通過getApplication()
獲取)。 - 依賴關系:依賴
Application
上下文(注意:避免持有Activity
的Context
,防止內存泄漏)。 - 適用場景:需要訪問 Android 系統資源(如數據庫、SharedPreferences、資源文件等)時使用。
- 示例代碼:
class MyAndroidViewModel(application: Application) : AndroidViewModel(application) {private val _data = MutableLiveData<String>()val data: LiveData<String> get() = _datafun fetchData() {// 使用 Application 上下文(如訪問資源或數據庫)val appName = getApplication<Application>().resources.getString(R.string.app_name)_data.value = "Data from ${appName}"} }
關鍵區別總結
特性 | ViewModel | AndroidViewModel |
---|---|---|
父類 | androidx.lifecycle.ViewModel | ViewModel 的子類 |
Context 支持 | 無 | 提供 Application 上下文 |
使用場景 | 純邏輯處理 | 需要訪問 Android 系統資源(如數據庫) |
內存泄漏風險 | 無 | 低(僅持有 Application Context) |
如何選擇?
- 優先用
ViewModel
:除非需要Context
,否則盡量用ViewModel
,避免不必要的上下文依賴。 - 謹慎使用
Context
:即使使用AndroidViewModel
,也只用Application
上下文,切勿持有Activity
或View
的引用。
擴展說明
- 如果只需要
Application
上下文,也可以通過依賴注入(如 Hilt)將Application
注入到普通ViewModel
中,而非繼承AndroidViewModel
。這是更現代的做法:class MyViewModel @Inject constructor(private val application: Application ) : ViewModel() { ... }
根據需求選擇合適的方式,保持代碼的清晰和可測試性。