本篇文章給大家分享的是有關(guān)Android 中ViewModel組件如何使用,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
成都創(chuàng)新互聯(lián)公司成立于2013年,先為華亭等服務(wù)建站,華亭等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為華亭企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
implementation "androidx.fragment:fragment:1.0.0"
implementation "androidx.lifecycle:lifecycle-viewmodel:2.0.0"
implementation "androidx.lifecycle:lifecycle-extensions:2.0.0"
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProvider.Factory;
import androidx.lifecycle.ViewModelProviders;
import androidx.lifecycle.ViewModelStore;
import androidx.lifecycle.ViewModelStoreOwner;
ViewModel 是一個抽象類,類中只定義了一個空實現(xiàn)的 onCleared() 方法。
@SuppressWarnings() { } }
AndroidViewModel 類擴展了 ViewModel 類,增加了 Application 字段,在構(gòu)造方法初始化,并提供了 getApplication() 方法。
public class AndroidViewModel extends ViewModel {
private Application mApplication;
public AndroidViewModel(@NonNull Application application) {
mApplication = application;
}
/**
* Return the application.
*/
@NonNull
public
獲取 ViewModel 對象代碼如下:
ViewModelProviders.of(activityOrFragment).get(ViewModel::class.java)
ViewModelProviders 類提供了4個靜態(tài)工廠方法 of() 創(chuàng)建新的 ViewModelProvider 對象。
ViewModelProviders.of(Fragment)
ViewModelProviders.of(FragmentActivity)
ViewModelProviders.of(Fragment, Factory)
ViewModelProviders.of(FragmentActivity, Factory)
ViewModelProvider 負責(zé)提供 ViewModel 對象,類中定義了以下兩個字段:
private final Factory mFactory;
private final ViewModelStore mViewModelStore;
先說說這兩個類的功能。
Factory 接口定義了一個創(chuàng)建 ViewModel 的接口 create(),ViewModelProvider 在需要時調(diào)用該方法新建 ViewModel 對象。
public interface Factory {
Android 已經(jīng)內(nèi)置了2個 Factory 實現(xiàn)類,分別是:
AndroidViewModelFactory 實現(xiàn)類,可以創(chuàng)建 ViewModel 和 AndroidViewModel 子類對象。
NewInstanceFactory 類,只可以創(chuàng)建 ViewModel 子類對象。
它們的實現(xiàn)都是通過反射機制調(diào)用 ViewModel 子類的構(gòu)造方法創(chuàng)建對象。
public static class NewInstanceFactory implements Factory {
@Override
public
AndroidViewModelFactory 繼承 NewInstanceFactory 類,是個單例,支持創(chuàng)建 AndroidViewModel 子類對象。
public static class AndroidViewModelFactory extends ViewModelProvider.NewInstanceFactory {
private static AndroidViewModelFactory sInstance;
public static AndroidViewModelFactory getInstance(Application application) {
if (sInstance == null) {
sInstance = new AndroidViewModelFactory(application);
}
return sInstance;
}
private Application mApplication;
public AndroidViewModelFactory(Application application) {
mApplication = application;
}
@Override
public
ViewModelStore 類中維護一個 Map
public class ViewModelStore {
private final HashMap<String, ViewModel> mMap = new HashMap<>();
final void put(String key, ViewModel viewModel) {
ViewModel oldViewModel = mMap.put(key, viewModel);
}
final ViewModel get(String key) {
return mMap.get(key);
}
}
ViewModelStore 是來自于 FragmentActivity 和 Fragment,它們實現(xiàn)了 ViewModelStoreOwner 接口,返回當前 UI 作用域里的 ViewModelStore 對象。
public interface ViewModelStoreOwner {
ViewModelStore getViewModelStore();
}
在 Fragment 類中的實現(xiàn)如下:
public ViewModelStore getViewModelStore() {
if (getContext() == null) {
throw new IllegalStateException("Can't access ViewModels from detached fragment");
}
if (mViewModelStore == null) {
mViewModelStore = new ViewModelStore();
}
return mViewModelStore;
}
在 FragmentActivity 類中的實現(xiàn)如下:
public ViewModelStore getViewModelStore() {
if (getApplication() == null) {
throw new IllegalStateException("Your activity is not yet attached to the "
+ "Application instance. You can't request ViewModel before onCreate call.");
}
if (mViewModelStore == null) {
mViewModelStore = new ViewModelStore();
}
return mViewModelStore;
}
回到 of() 方法的實現(xiàn)
public static ViewModelProvider of(FragmentActivity activity, Factory factory) {
Application application = checkApplication(activity);
if (factory == null) {
factory = ViewModelProvider.AndroidViewModelFactory.getInstance(application);
}
return new ViewModelProvider(activity.getViewModelStore(), factory);
}
在創(chuàng)建 ViewModelProvider 對象時需要傳入 ViewModelStore 和 Factory 對象。若 factory 為 null,將使用 AndroidViewModelFactory 單例對象。
調(diào)用 ViewModelProvider 對象的 get() 方法獲取 ViewModel 對象,如果在 ViewModelStore 里不存在,則使用 Factory 創(chuàng)建一個新的對象并存放到 ViewModelStore 里。
public <T extends ViewModel> T get(String key, Class<T> modelClass) {
ViewModel viewModel = mViewModelStore.get(key);
if (modelClass.isInstance(viewModel)) {
return (T) viewModel;
}
viewModel = mFactory.create(modelClass);
mViewModelStore.put(key, viewModel);
return (T) viewModel;
}
當 Activity 或 Fragment 被系統(tǒng)重建時,ViewModel 對象不會被銷毀,新的 Activity 或 Fragment 對象拿到的是同一個 ViewModel 對象。
在 FragmentActivity#onRetainNonConfigurationInstance() 方法中,會將 ViewModelStore 對象保留起來。
public final Object onRetainNonConfigurationInstance() {
Object custom = onRetainCustomNonConfigurationInstance();
FragmentManagerNonConfig fragments = mFragments.retainNestedNonConfig();
if (fragments == null && mViewModelStore == null && custom == null) {
return null;
}
NonConfigurationInstances nci = new NonConfigurationInstances();
nci.custom = custom;
nci.viewModelStore = mViewModelStore;
nci.fragments = fragments;
return nci;
}
然后在 onCreate() 方法能獲取之前保留起來的 ViewModelStore 對象。
protected void onCreate(Bundle savedInstanceState) {
mFragments.attachHost(null /*parent*/);
super.onCreate(savedInstanceState);
NonConfigurationInstances nc = (NonConfigurationInstances) getLastNonConfigurationInstance();
if (nc != null) {
mViewModelStore = nc.viewModelStore;
}
// ...
}
那 Fragment 作用域里是如何實現(xiàn)的呢?在 FragmentActivity 的 onRetainNonConfigurationInstance() 方法中里有這樣一句代碼:
FragmentManagerNonConfig fragments = mFragments.retainNestedNonConfig();
實現(xiàn)保留的機制是一樣的,只不過放在 FragmentManagerNonConfig 對象中。是在 FragmentManager#saveNonConfig() 方法中將 ViewModelStore 對象保存到 FragmentManagerNonConfig 里的。
void saveNonConfig() {
ArrayList
該方法的調(diào)用順序是:FragmentActivity#onSaveInstanceState() -> FragmentManager#saveAllState() -> FragmentManager#saveNonConfig()。
在 FragmentActivity 類的 onDestory() 方法中。
@Override
protected void onDestroy() {
super.onDestroy();
if (mViewModelStore != null && !isChangingConfigurations()) {
mViewModelStore.clear();
}
mFragments.dispatchDestroy();
}
在 Fragment 類的 onDestory() 方法中。
public void onDestroy() {
mCalled = true;
FragmentActivity activity = getActivity();
boolean isChangingConfigurations = activity != null && activity.isChangingConfigurations();
if (mViewModelStore != null && !isChangingConfigurations) {
mViewModelStore.clear();
}
}
先判斷是否有發(fā)生 Configuration Changes,如果沒有則會調(diào)用 ViewModelStore 的 clear() 方法,再一一調(diào)用每一個 ViewModel 的 onCleared() 方法。
public final void clear() {
for (ViewModel vm : mMap.values()) {
vm.onCleared();
}
mMap.clear();
}
以上就是Android 中ViewModel組件如何使用,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
名稱欄目:Android中ViewModel組件如何使用
地址分享:http://chinadenli.net/article2/gshpoc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、品牌網(wǎng)站制作、網(wǎng)頁設(shè)計公司、響應(yīng)式網(wǎng)站、搜索引擎優(yōu)化、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)