我有一個叫做RecipesViewModel
的ViewModel。通常情況下,我實例化這種方式:直接實例化ViewModel,而不使用ViewModelProviders.of方法
RecipesViewModel viewModel = ViewModelProviders.of(this, new ViewModelProvider.Factory() {
@Override
public <T extends ViewModel> T create(Class<T> modelClass) {
return (T) new RecipesViewModel(recipesRepository);
}
}).get(RecipesViewModel.class);
但現在我使用dagger2,所以我把@Inject
註解這個視圖模型的構造,所以我可以直接在我的片段注入它,使用現場注射器。
我的問題是:我是否會失去一些啓動viewmodel這種方式而不是ViewModelProviders.of
的方式?我的ViewModel已經是Scoped,所以在上下文中只創建一個實例。
其他選項是隻將工廠實例移動到dagger2模塊,但如果沒有問題,我更喜歡第一個方法。
- 編輯 -
閱讀該文檔android.arch.lifecycle.ViewModel
,我有點更害怕。使用ViewModelProviders.of來提供範圍(片段或活動)。如果我直接實例化它,範圍是什麼?
ViewModel是一個類,負責準備和管理活動或片段的數據。它還處理Activity/Fragment與 應用程序的其餘部分(例如調用業務邏輯類)的 通信。
ViewModel始終與範圍(片段 或活動)相關聯地創建,並且只要該範圍處於活動狀態,它將被保留。 例如如果它是一個活動,直到完成。
換句話說,這意味着如果 的所有者因配置更改(例如旋轉)而被銷燬,ViewModel將不會被銷燬。所有者的新實例 將重新連接到現有的 ViewModel。
- /編輯 -
的RecipesViewModel代碼如下表所示:
@PerActivity
public class RecipesViewModel extends ViewModel {
private static final String TAG = "RecipesViewModel";
private final RecipesRepository recipesRepository;
private LiveData<List<Recipe>> recipes = null;
@Inject
public RecipesViewModel(RecipesRepository recipesRepository) {
this.recipesRepository = recipesRepository;
}
public final void loadAll() {
recipes = recipesRepository.getRecipes();
}
public LiveData<List<Recipe>> getRecipes() {
return recipes;
}
}
沒有試驗,只從文檔中閱讀,以及我對建築組件的瞭解,都歸結爲您如何管理範圍。例如,如果在配置更改時創建了一個新的Dagger組件,那麼由該組件提供的視圖模型肯定會與之前的視圖模型不同,因爲範圍與組件綁定。我從文檔中得到的是,如果使用''ViewModelProviders.of'',這不會發生。只要匕首組件是相同的,這也不會發生 - 所提供的視圖模型也是相同的。 – Fred
ViewModelProviders提供一個存儲空間,該存儲空間的作用域是當前Activity或fragment,並在配置更改時傳遞給下一個實例。如果您將ViewModel聲明爲全局單例,則可能會導致問題,因爲狀態將在不同的活動或片段實例之間共享,並且ViewModel也不會使用Activity或Fragment銷燬。 – BladeCoder