首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android Architecture Component之ViewModel解析ViewModelViewModelProvidersFactoryNewInstanceFactoryAndroi

Android Architecture Component之ViewModel解析ViewModelViewModelProvidersFactoryNewInstanceFactoryAndroi

作者头像
俞其荣
发布于 2018-07-25 09:26:44
发布于 2018-07-25 09:26:44
1K00
代码可运行
举报
文章被收录于专栏:俞其荣的博客俞其荣的博客
运行总次数:0
代码可运行

注意:本文只是初稿

基于 android.arch.lifecycle:extensions:1.1.1

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
XXXViewModel xxxViewModel = ViewModelProviders.of(activity).get(XXXViewModel.class)

ViewModel

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public abstract class ViewModel {
    /**
     * This method will be called when this ViewModel is no longer used and will be destroyed.
     * <p>
     * It is useful when ViewModel observes some data and you need to clear this subscription to
     * prevent a leak of this ViewModel.
     */
    @SuppressWarnings("WeakerAccess")
    protected void onCleared() {
    }
}

ViewModelProviders

of

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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(ViewModelStores.of(fragment), 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(ViewModelStores.of(activity), factory);
}

Factory

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface Factory {
    /**
     * Creates a new instance of the given {@code Class}.
     * <p>
     *
     * @param modelClass a {@code Class} whose instance is requested
     * @param <T>        The type parameter for the ViewModel.
     * @return a newly created ViewModel
     */
    @NonNull
    <T extends ViewModel> T create(@NonNull Class<T> modelClass);
}

NewInstanceFactory

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Simple factory, which calls empty constructor on the give class.
 */
public static class NewInstanceFactory implements Factory {

    @SuppressWarnings("ClassNewInstance")
    @NonNull
    @Override
    public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
        //noinspection TryWithIdenticalCatches
        try {
            return modelClass.newInstance();
        } catch (InstantiationException e) {
            throw new RuntimeException("Cannot create an instance of " + modelClass, e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException("Cannot create an instance of " + modelClass, e);
        }
    }
}

AndroidViewModelFactory

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * {@link Factory} which may create {@link AndroidViewModel} and
 * {@link ViewModel}, which have an empty constructor.
 */
public static class AndroidViewModelFactory extends ViewModelProvider.NewInstanceFactory {

    private static AndroidViewModelFactory sInstance;

    /**
     * Retrieve a singleton instance of AndroidViewModelFactory.
     *
     * @param application an application to pass in {@link AndroidViewModel}
     * @return A valid {@link AndroidViewModelFactory}
     */
    @NonNull
    public static AndroidViewModelFactory getInstance(@NonNull Application application) {
        if (sInstance == null) {
            sInstance = new AndroidViewModelFactory(application);
        }
        return sInstance;
    }

    private Application mApplication;

    /**
     * Creates a {@code AndroidViewModelFactory}
     *
     * @param application an application to pass in {@link AndroidViewModel}
     */
    public AndroidViewModelFactory(@NonNull Application application) {
        mApplication = application;
    }

    @NonNull
    @Override
    public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
        if (AndroidViewModel.class.isAssignableFrom(modelClass)) {
            //noinspection TryWithIdenticalCatches
            try {
                return modelClass.getConstructor(Application.class).newInstance(mApplication);
            } catch (NoSuchMethodException e) {
                throw new RuntimeException("Cannot create an instance of " + modelClass, e);
            } catch (IllegalAccessException e) {
                throw new RuntimeException("Cannot create an instance of " + modelClass, e);
            } catch (InstantiationException e) {
                throw new RuntimeException("Cannot create an instance of " + modelClass, e);
            } catch (InvocationTargetException e) {
                throw new RuntimeException("Cannot create an instance of " + modelClass, e);
            }
        }
        return super.create(modelClass);
    }
}

ViewStore

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Factory methods for {@link ViewModelStore} class.
 */
@SuppressWarnings("WeakerAccess")
public class ViewModelStores {

    private ViewModelStores() {
    }

    /**
     * Returns the {@link ViewModelStore} of the given activity.
     *
     * @param activity an activity whose {@code ViewModelStore} is requested
     * @return a {@code ViewModelStore}
     */
    @NonNull
    @MainThread
    public static ViewModelStore of(@NonNull FragmentActivity activity) {
        if (activity instanceof ViewModelStoreOwner) {
            return ((ViewModelStoreOwner) activity).getViewModelStore();
        }
        return holderFragmentFor(activity).getViewModelStore();
    }

    /**
     * Returns the {@link ViewModelStore} of the given fragment.
     *
     * @param fragment a fragment whose {@code ViewModelStore} is requested
     * @return a {@code ViewModelStore}
     */
    @NonNull
    @MainThread
    public static ViewModelStore of(@NonNull Fragment fragment) {
        if (fragment instanceof ViewModelStoreOwner) {
            return ((ViewModelStoreOwner) fragment).getViewModelStore();
        }
        return holderFragmentFor(fragment).getViewModelStore();
    }
}

HolderFragment

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @hide
 */
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public static HolderFragment holderFragmentFor(FragmentActivity activity) {
    return sHolderFragmentManager.holderFragmentFor(activity);
}

    HolderFragment holderFragmentFor(FragmentActivity activity) {
        FragmentManager fm = activity.getSupportFragmentManager();
        HolderFragment holder = findHolderFragment(fm);
        if (holder != null) {
            return holder;
        }
        holder = mNotCommittedActivityHolders.get(activity);
        if (holder != null) {
            return holder;
        }

        if (!mActivityCallbacksIsAdded) {
            mActivityCallbacksIsAdded = true;
            activity.getApplication().registerActivityLifecycleCallbacks(mActivityCallbacks);
        }
        holder = createHolderFragment(fm);
        mNotCommittedActivityHolders.put(activity, holder);
        return holder;
    }

ViewModelProvider

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@NonNull
@MainThread
public <T extends ViewModel> T get(@NonNull Class<T> modelClass) {
    String canonicalName = modelClass.getCanonicalName();
    if (canonicalName == null) {
        throw new IllegalArgumentException("Local and anonymous classes can not be ViewModels");
    }
    return get(DEFAULT_KEY + ":" + canonicalName, modelClass);
}

@NonNull
@MainThread
public <T extends ViewModel> T get(@NonNull String key, @NonNull Class<T> modelClass) {
    ViewModel viewModel = mViewModelStore.get(key);

    if (modelClass.isInstance(viewModel)) {
        //noinspection unchecked
        return (T) viewModel;
    } else {
        //noinspection StatementWithEmptyBody
        if (viewModel != null) {
            // TODO: log a warning.
        }
    }

    viewModel = mFactory.create(modelClass);
    mViewModelStore.put(key, viewModel);
    //noinspection unchecked
    return (T) viewModel;
}

ViewModel的onCleared什么时候回调

ViewModel

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 *  Clears internal storage and notifies ViewModels that they are no longer used.
 */
public final void clear() {
    for (ViewModel vm : mMap.values()) {
        vm.onCleared();
    }
    mMap.clear();
}

Fragment

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Called when the fragment is no longer in use.  This is called
 * after {@link #onStop()} and before {@link #onDetach()}.
 */
@CallSuper
public void onDestroy() {
    mCalled = true;
    // Use mStateSaved instead of isStateSaved() since we're past onStop()
    if (mViewModelStore != null && !mHost.mFragmentManager.mStateSaved) {
        mViewModelStore.clear();
    }
}

FragmentActivity

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Destroy all fragments.
 */
@Override
protected void onDestroy() {
    super.onDestroy();

    doReallyStop(false);

    if (mViewModelStore != null && !mRetaining) {
        mViewModelStore.clear();
    }

    mFragments.dispatchDestroy();
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.07.07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ViewModel 源码分析
从图可以看出来,ViewModel 与 LiveData 和 Paging 是谷歌新组件,同时它是 android.arch.lifecycle 包里面的类,可以支持 activity 和 fragment 共享数据(比如在 fragment 获取 activity 搜索框的内容)当然 activity 销毁了数据就不存在了;又或者是 fragment 与子 fragment 共享数据(比如 fragment 里面嵌套了 viewpager , viewpager 里又有 fragemnt)。
ppjun
2018/09/05
8450
ViewModel 源码分析
Android Jetpack 组件之 ViewModel 详解
ViewModel 具有生命周期意识,会自动存储和管理 UI 相关的数据,即使设备配置发生变化后数据还会存在,我们就不需要在 onSaveInstanceState 保存数据,在 onCreate 中恢复数据了,使用 ViewModel 这部分工作就不需要我们做了,很好地将视图与逻辑分离开来。
子晋
2022/01/18
1.4K0
Android Jetpack 组件之 ViewModel 详解
5. Jetpack源码解析---ViewModel基本使用及源码解析
2. Jetpack源码解析—Navigation为什么切换Fragment会重绘?
Hankkin
2019/08/14
8920
【AAC 系列四】深入理解架构组件:ViewModel
在上一篇 LiveData 原理分析一文中,我们提到了 ViewModel ,它跟 LiveData 配合能够把价值发挥到最大。
程序亦非猿
2019/08/16
1K0
【AAC 系列四】深入理解架构组件:ViewModel
Android AAC架构实践
本文就如上问题结合aac框架源码进行逐步解析 ##一.LiveData实现数据更新 既然是监测数据更新,肯定是使用到观察者模式
用户9227784
2021/12/15
1.1K0
Android 面试题:为什么 Activity 都重建了 ViewModel 还存在?—— Jetpack 系列(3)
ViewModel 是 Jetpack 组件中较常用的组件之一,也是实现 MVVM 模式或 MVI 模式的标准组件之一。在这篇文章里,我将与你讨论 ViewModel 实用和面试常见的知识点。如果能帮上忙请务必点赞加关注,这对我非常重要。
用户9995743
2022/09/26
1.4K0
Android 面试题:为什么 Activity 都重建了 ViewModel 还存在?—— Jetpack 系列(3)
Android Jetpack架构组件(三)之ViewModel
我的博客即将同步至 OSCHINA 社区,这是我的 OSCHINA ID:xiangzhihong,邀请大家一同入驻:https://www.oschina.net/sharing-plan/apply
xiangzhihong
2020/12/21
1.5K0
Android从零开始搭建MVVM架构(3)——ViewModel
ViewModel类是被设计用来以可感知生命周期的方式存储和管理 UI 相关数据,ViewModel中数据会一直存活即使 activity configuration发生变化。
老马的编程之旅
2022/06/22
8050
Android从零开始搭建MVVM架构(3)——ViewModel
Android Architecture Components 之LiveData, ViewModel
一 入口 阅读源码需要从源码的入口处着手,先看先官方的例子(https://developer.android.com/topic/libraries/architecture/livedata): ViewModel public class NameViewModel extends ViewModel { // Create a LiveData with a String private MutableLiveData<String> mCurrentName; public Muta
用户1127566
2018/06/06
8070
ViewModel创建过程详解
首先会创建一个 ViewModelProvider ,ViewModelProvider 的构造函数如下:
烧麦程
2022/05/10
1.3K0
ViewModel创建过程详解
Jetpack:ViewModel
引入ViewModel之前,存在如下几个问题: (1)有的时候一个Activity里面嵌套了多个fragment,但是这些fragment里面用的是同一个数据,为了同步这些数据,我们需要用接口来传参,很麻烦 (2)屏幕旋转,会销毁重建,如果数据类型比较简单,同时数据量也不大,可以通过onSaveInstanceState()存储数据.但如果是大量数据,不方便序列化及反序列化,则上述方法将不适用.
提莫队长
2020/06/03
7350
“终于懂了“系列:Jetpack AAC完整解析(三)ViewModel 完全掌握!
上一篇介绍了Jetpack AAC 的数据处理组件 LiveData,它是使得 数据的更新 能以观察者模式 被observer感知,且此感知只发生在活跃生命周期状态。这篇来介绍与LiveData搭配使用的视图模型组件——ViewModel。
胡飞洋
2021/01/12
1.9K0
“终于懂了“系列:Jetpack AAC完整解析(三)ViewModel 完全掌握!
JetPack组件学习ViewModel
1.需要先创建ViewModel类,继承自ViewModel重写onclear方法,使得页面销毁的时候能够走到自定义的onClear方法中
北洋
2022/05/10
6870
JetPack组件学习ViewModel
Android Architecture Components Part4:ViewModel
在Android Architecture Components(AAC)中ViewMode是为界面组件提供数据并可在界面配置更改后继续存在的对象。例如界面的旋转导致界面配置信息改变。
Rouse
2019/07/16
6200
Android Architecture Components Part4:ViewModel
Android-Jetpack笔记-ViewModel
ViewModel处于数据逻辑层,他的生命周期贯穿整个宿主,如act因屏幕旋转销毁重建时,其依然存活,只有act.finish后,才会自动销毁,因此可以用他来维持宿主的数据状态。现在比较流行的方式是把他当做唯一数据源来驱动UI展示:
Holiday
2020/08/10
8270
Android-Jetpack笔记-ViewModel
ViewModel三问—阿里真题
上期我们说过了MVVM架构,那么接下来我们就继续说说里面的相关组件,今天轮到ViewModel :
码上积木
2020/11/03
7560
【协程】ViewModelScope源码解析
使用协程,相信很多同学已经信手拈来了,但是关于ViewModelScope,可能很多同学在用,但却不知道原理,今天来一探究竟。
yechaoa
2022/06/10
5240
使用 Architecture Component 实现 MVVM 的正确姿势
网上关于 MVVM 的介绍非常多,这里不再赘述,直接看一个例子,用直观的代码来感受一下用 MVVM 开发,是一种什么样的感受
GeeJoe
2021/12/09
8520
使用 Architecture Component 实现 MVVM 的正确姿势
Andorid-JetPack-ViewModel组件
其实就是ViewModel实例被保存了下来,页面重建之后获取的ViewModel是同一个
花落花相惜
2021/11/24
1.8K0
Kotlin就几行代码? 用SharedFlow写个FlowEventBus
跨页面通信是一个比较常见的场景,通常我们会选择使用EventBus,但EventBus无法感知生命周期,收到消息就会回调,所以有了LiveData之后很快就有了LiveEventBus。不过它也有缺点,比如不能切换接收线程。现在SharedFlow稳定了,那是不是也能搞一波?
程序员小顾
2021/12/23
1.1K0
相关推荐
ViewModel 源码分析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验