androidx.lifecycle 中 ViewModelProviders 源碼學習

 

如果在學習 LiveData ,其中需要ViewModelProviders,會出現爆紅,找不到該類的方法,那是沒有導入相關庫,如下:

    implementation "androidx.lifecycle:lifecycle-viewmodel:2.1.0"
    implementation 'android.arch.lifecycle:extensions:1.1.1'

 

首先 ViewModelProviders 裏有兩個靜態 私有方法,一個checkAppliaction ,另一個 是checkActivity :

private static Application checkApplication(Activity activity)
{
    Application applictaion = activity.getApplication();
    if(application==null)
    {
        throw new IllegalStateExceptio("Your activity/fragment is not yet attached to "+ "Application. You can't request ViewModel before onCreate call.");
    }

    return application;

}

檢查是activity 或者 fragment 是否依附在Application 上,並返回application 實例,否則拋出錯誤

private static Activity checkActivity (Fragment fragment){

    Activity activity  = fragment. getActivity();
    if(activity==null)
    {
        throw new("Can't create ViewModelProvider for detached fragment");

    }

    return activity;
}

checkActivity 該方法是檢查 fragment 是否綁定在activity ,如果沒有,則拋出錯誤,返回activity。

 

of方法

 

ViewModelProviders 類中,of 使用重載,分別是:

of(@NonNull Fragment fragment) 

@NonNull
@MainThread
public static ViewModelProvider of (@NonNull Fragment fragment)
{
    return of(fragment,null)
}

該方法指向  of(@NonNull Fragment fragment, @Nullable Factory factory) ,得到  ViewModelProvider 實例

tips:

@NonNull 修飾的參數或者程序時,開發IDE工具會警告程序可能會有崩潰的風險,這是靜態分析方法,運行時不會有任何警告

@MainThread:表示標記的方法只應在主線程調用。如果標記的是一個類,那麼該類中的所有方法都應該是在主線程被調用。例:(通常,應用程序的主線程也是 Ui 線程。但是,在特殊情況下,應用程序的主線程可能不是其 Ui 線程)

 

of(@NonNull FragmentActivity activity)

@NonNull
@MainThread
public static ViewModelProvider of (@NonNull FragmentActivity activity)
{

      return of(activity,null)

}

傳入的參數  FragmentActivity 和 Factory  , 其中 Factory可以爲null,一般都爲null,並且指向of(@NonNull FragmentActivity activity,@Nullable Factory factory)

 

of(@NonNull Fragment fragment, @Nullable Factory factory)

@NonNull
@MainThread
public static ViewModelProvider of(@NonNull Fragment fragment, @Nullable Factory factory) {
        Application application = checkApplication(checkActivity(fragment));
        if (factory == null) {
            factory = ViewModelProvider.AndroidViewModelFactory.getInstance(application);
        }
        return new ViewModelProvider(fragment.getViewModelStore(), factory);
    }

該方法傳入 fragment 和 null 參數,首先檢查 fragment 是否綁定在activity 和是否依附在Application 並返回application,接着 根據 factory 參數 的null 值 ,實例化ViewMoels,返回 實例化ViewModelProvider

of(@NonNull FragmentActivity activity,@Nullable Factory factory)

@NonNull
@MainThread
public static ViewModelProvider of(@NonNull FragmentActivity activity,@Nullable Factory factory) {
        Application application = checkApplication(activity);
        if (factory == null) {
            factory = ViewModelProvider.AndroidViewModelFactory.getInstance(application);
        }
        return new ViewModelProvider(activity.getViewModelStore(), factory);
}

該方法傳入 activity 和 null 參數,首先檢查 activity是否依附在Application,接着 根據 factory 參數 的null 值 ,實例化ViewMoels,返回 實例化ViewModelProvider。

tips:fragmentactivity 繼承自activity,用來解決android3.0 之前沒有fragment的api,所以在使用的時候需要導入support包,同時繼承fragmentActivity,這樣在activity中就能嵌入fragment來實現你想要的佈局效果。 

 

   @Deprecated
    public static class DefaultFactory extends ViewModelProvider.AndroidViewModelFactory {
        /**
         * Creates a {@code AndroidViewModelFactory}
         *
         * @param application an application to pass in {@link AndroidViewModel}
         * @deprecated Use {@link ViewModelProvider.AndroidViewModelFactory} or
         * {@link ViewModelProvider.AndroidViewModelFactory#getInstance(Application)}.
         */
        @Deprecated
        public DefaultFactory(@NonNull Application application) {
            super(application);
        }
    }

該方法被@Deprecated,是可能之前有用過,現在不需要了, 在Java中凡是使用@Deprecated標誌的類,都是不鼓勵使用的類,如果使用或者進行重寫,程序會發出警告。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章