androidx.lifecycle 中 ViewModelProviders 源码学习

您所在的位置:网站首页 viewmodelproviders过时 androidx.lifecycle 中 ViewModelProviders 源码学习

androidx.lifecycle 中 ViewModelProviders 源码学习

2023-07-25 08:37| 来源: 网络整理| 查看: 265

 

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3