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标志的类,都是不鼓励使用的类,如果使用或者进行重写,程序会发出警告。

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