如果在学习 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。
ViewModelProviders 类中,of 使用重载,分别是:
@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 线程)
@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)
@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
@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标志的类,都是不鼓励使用的类,如果使用或者进行重写,程序会发出警告。