您当前的位置: 首页 >  面试
  • 0浏览

    0关注

    674博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

面试:Jetpack相关

沙漠一只雕得儿得儿 发布时间:2021-12-11 21:41:25 ,浏览量:0

一、LifeCycle原理

Lifecycle的生命周期状态事件和状态

Lifecycle是一个抽象类,其内部包括了添加和移除观察者的方法,还包括了此前说到的Event和State枚举。Lifecycle使用两个枚举来跟踪其关联组件的生命周期状态,这两个枚举分别是Event和State。 State指的是Lifecycle的生命周期所处的状态。 Event代表Lifecycle生命周期对应的事件,这些事件会映射到Activity和Fragment中的回调事件中。

Lifecycle如何观察Activity和Fragment的生命周期

Activity和Fragment已经默认实现了LifecycleOwner接口,LifecycleOwner可以理解为被观察者

ComponentActivity内创建了LifecycleRegistry,LifecycleRegistry是Lifecycle的实现类,并注入到了ReportFragment。ReportFragment中会调用dispatch方法,对生命周期event事件进行分发。

到了LifecycleRegistry.handleLifecycleEvent进行处理。

ComponentActivity中-->onCreate-->ReportFragment.injectIfNeededIn(this);-->dispatchCreate/dispatchStart/dispatchResume-->dispatch-->LifecycleRegistry.handleLifecycleEvent-->moveToState-->sync-->backwardPass/forwardPass-->observer.dispatchEvent-->mLifecycleObserver.onStateChanged

在activity中,getLifecycle().addObserver(LifecycleObserver)将观察者和被观察者联系在一起 Lifecycle的实现类LifecycleRegistry中handleLifecycleEvent处理页面生命周期的走向,通过event的事件,驱动state状态的改变observer.dispatchEvent(lifecycleOwner, event);-->mLifecycleObserver.onStateChanged(owner, event);

onStateChanged-->ReflectiveGenericLifecycleObserver-->invokeCallbacks-->ClassesInfoCache(反射优化) 在createInfo中获取方法上的注解OnLifecycleEvent通过反射调用invokeCallback

Android Jetpack架构组件(三)带你了解Lifecycle(原理篇) | BATcoder - 刘望舒 实现LifecycleObserver接口的类中,注解修饰的方法和事件会被保存起来,通过反射对事件的对应方法进行调用。或者使用注解处理器,生成的Java代码里就是接口的回调。

利用events事件来改变states状态:

Lifecycle包含了移除、添加观察者,还 使用两个枚举来跟踪其关联组件的生命周期状态,这两个枚举分别是Event和State。 State指的是Lifecycle的生命周期所处的状态。 Event代表Lifecycle生命周期对应的事件,这些事件会映射到Activity和Fragment中的回调事件中。

在这里插入图片描述

Android Jetpack架构组件(三)带你了解Lifecycle(原理篇) | BATcoder - 刘望舒

​​​​​​Lifecycle 使用与源码分析——彻底搞懂Lifecycle原理_薛瑄的博客-CSDN博客_lifecycle原理

生命周期事件管理利器 —— Lifecycle 原理详解 - 简书

二、ViewModel原理

 ViewModel管理的数据有一个特点,就是不会随着页面配置改变而销毁,但在页面销毁时则会正常跟着销毁。整体流程比较清楚:​​​​​​Android ViewModel 实现原理 - 知乎

ViewModel原理 - 掘金

1、viewmodel的获取:首先调用ViewModelProvider.get()方法,从ViewModelStore中获取ViewModel,有则直接返回,没有就创建后返回。 

ComponentActivity持有一个ViewModelStore,可以通过ViewModelStoreOwner中的getViewModelStore()方法获取。

HashMap mMap = new HashMap();

mMap 是ViewModelStore 中有且仅有的成员变量,看它的泛型类型参数就能明白,它就是 ViewModelStore 用来存储 ViewModel 的池子。

final void put(String key, ViewModel viewModel)

ViewModelStore 顾名思义,它是负责储存 ViewModel 的一个类。引用 ViewModelStore 代码注释中的一段话表示它的功能:

ViewModelStore 的实例必须在发生配置更改时得以保留:如果此 ViewModelStore 的所有者由于配置的改变而被销毁并重新创建,那么所有者的新实例应该具有相同的 ViewModelStore 旧实例。

2、viewmodel中值的保存和恢复:

1,系统配置改变时,构建一个NonConfigurationInstance,将ViewModelStore保持到NonConfigurationInstance,再将NonConfigurationInstance保存到ActivityClientRecord的lastNonConfigurationInstances

2,恢复时,将ActivityClientrecord的lastNonConfigurationInstances传递给新的Activity,再通过getViewModelStore()获取时就能从新的Activity的lastNonConfigurationInstances获取ViewModelStore,进而获取之前的ViewModel

Android Jetpack(二)ViewModel 组件原理剖析_Chiclaim-CSDN博客

ViewModel 的基本原理就是:

Q1:viewModel什么时候保存值?

在 configuration changes 的时候,在界面 destroy 的时候(ActivityThread.performDestroyActivity)通过 onRetainNonConfigurationInstance 方法将 NonConfigurationInstances 对象(里面包含 ViewModel) 保存起来。

Q2:viewModel什么时候恢复?

在重建 Activity 的时候在 attach 方法中(ActivityThread.performLaunchActivity)将上次保存的 NonConfigurationInstances 对象赋值给 Activity 的成员变量 mLastNonConfigurationInstances,然后在 onCreate 中通过 getLastNonConfigurationInstance 方法获取上次保存的 NonConfigurationInstances 对象。

ViewModel.onCleared() 资源回收:

既然ViewModel是生命周期感知的,那么何时应该清理ViewModel呢?

我们来到FragmentActivity的onDestroy()方法,发现它是在这里清理的.

/**
 * Destroy all fragments.
 */
@Override
protected void onDestroy() {
    super.onDestroy();

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

    mFragments.dispatchDestroy();
}

三、LiveData原理

 LiveData是一个数据持有组件,主要用来通知数据观察者数据发生了更新,它通过与LifecycleOwner组件绑定,实现可以只在页面活跃状态下发起通知,并在页面销毁时自动取消订阅,防止内存泄漏。

LiveData的工作原理 - 简书

Android Jetpack架构组件——LiveData原理篇 | 我就是马云飞

相关问题:

Q1:LiveData是如何观察生命周期变化的?

简单回答:LifecycleBoundObserver添加到Lifecycle中完成注册,通过LifeCycle监听生命周期变化

详解如下:

如何观察生命周期,我们需要通过他的observe方法去看,我们上源码:

@MainThread
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer            
关注
打赏
1657159701
查看更多评论
0.1569s