androidx.lifecycle 中 ViewModelProviders 源码学习 |
您所在的位置:网站首页 › viewmodelproviders过时 › 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标志的类,都是不鼓励使用的类,如果使用或者进行重写,程序会发出警告。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |