IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android Jetpack组件学习(一):LifeCycle -> 正文阅读

[移动开发]Android Jetpack组件学习(一):LifeCycle

前言

Lifecycle是Google推出的用于处理Activity和Fragment的生命周期相关问题的组件,是一种观察者模式的结构。

使用lifeCycle能够在生命周期的拥有者和观察者之间建立一种监听关系,当拥有者的生命周期发生变化时观察者能够及时监听到并作出对应的处理,同时观察者能够非常方便的判断当前拥有者的生命周期是什么。

从上面的描述上看,显然LifeCycle的使用场景是和Activity和Fragment的生命周期相关的业务逻辑。

举例来说,在MVP结构中,Presenter需要感知到Activity或者Fragment的生命周期,从而能够及时的处理和生命周期相关的业务逻辑,在这种需求下我们可以使用LifeCycle来观察生命周期,从而及时作出处理。

一、使用

LifeCycle主要分为两个部分:LifeCycleOwner和LifeCycleObserver.

1. LifeCycleOwner

LifeCycleOwner,生命周期的拥有者,一般情况下是指Activity和Fragment,自定义限制非常大,本次不做讨论。

AppCompatActivity和V4中的Fragment都已默认实现了LifeCycleOwner接口,因此我们可以在开发中直接使用。

2. LifeCycleObserver

LifeCycleObserver,生命周期的观察者需要实现此接口。
此接口内没有任何方法,对生命周期观察是通过注解onLifecycleEvent来实现的,示例代码如下:

class SingleMainLifeCycle : LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    fun onActivityOnCreate() {

    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun onActivityOnResume() {

    }
}

这样我们就创建了一个LifeCycleObserver实例,然后我们可以把这个观察者和拥有者建立联系,就能够进行监听了,示例代码如下:

class SingleMainActivity : BaseActivity<ActivitySingleMainBinding>() {

    override var viewBinding: ActivitySingleMainBinding = ActivitySingleMainBinding.inflate(layoutInflater)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //绑定lifecycle观察者
        lifecycle.addObserver(SingleMainLifeCycle())
    }
}

上述代码中由于Activity中已经实现了LifeCycleOwner接口,所以可以直接使用getLifeCycle()方法获取lifecycle进行绑定。绑定之后,在SingleMainLifeCycle中的方法就会在对应的生命周期内执行。

3. 判断生命周期执行达到的状态

Lifecycle能够判断当前的生命周期是否达到了某个状态,即是否大于等于当前的状态,代码如下:

        if(lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)){

        }

二、源码概要解析

下面对源码做一个概要说明,以Fragment为例,查看Fragment的getLifeCycle()方法可以看到如下:

    @Override
    @NonNull
    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }

是实现的LifeCycleOwner的接口,mLifecycleRegistry分别performStart(),performResume等perform方法中调用

mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.**);

查看下此方法,如下:

    public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
        State next = getStateAfter(event);
        moveToState(next);
    }

    private void moveToState(State next) {
        if (mState == next) {
            return;
        }
        mState = next;
        if (mHandlingEvent || mAddingObserverCounter != 0) {
            mNewEventOccurred = true;
            // we will figure out what to do on upper level.
            return;
        }
        mHandlingEvent = true;
        sync();
        mHandlingEvent = false;
    }

是通过sync()方法执行的同步到其他观察者,

    private void sync() {
        LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
        if (lifecycleOwner == null) {
            throw new IllegalStateException("LifecycleOwner of this LifecycleRegistry is already"
                    + "garbage collected. It is too late to change lifecycle state.");
        }
        while (!isSynced()) {
            mNewEventOccurred = false;
            // no need to check eldest for nullability, because isSynced does it for us.
            if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) {
                backwardPass(lifecycleOwner);
            }
            Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest();
            if (!mNewEventOccurred && newest != null
                    && mState.compareTo(newest.getValue().mState) > 0) {
                forwardPass(lifecycleOwner);
            }
        }
        mNewEventOccurred = false;
    }

此方法中有两个方法backwardPass()forwardPass()是执行同步过程,以backwardPass()为例,会从mObserverMap进行遍历,执行dispatchEvent(),将状态同步至所有的Observer.

    private void backwardPass(LifecycleOwner lifecycleOwner) {
        Iterator<Entry<LifecycleObserver, ObserverWithState>> descendingIterator =
                mObserverMap.descendingIterator();
        while (descendingIterator.hasNext() && !mNewEventOccurred) {
            Entry<LifecycleObserver, ObserverWithState> entry = descendingIterator.next();
            ObserverWithState observer = entry.getValue();
            while ((observer.mState.compareTo(mState) > 0 && !mNewEventOccurred
                    && mObserverMap.contains(entry.getKey()))) {
                Event event = downEvent(observer.mState);
                pushParentState(getStateAfter(event));
                observer.dispatchEvent(lifecycleOwner, event);
                popParentState();
            }
        }
    }

mObserverMap是用来存储LifecycleObserver,在绑定方法调用时会将监听者添加到此数据结构中。

总结

LifeCycle是采用了观察者模式,对LifeCycleOwner的生命周期进行监听,观察者能够及时的做出对应的动作。
LifeCycle作为jetpack中相对独立的组件,有许多自身的优势;同时是其他多个组件的基础内容,像LiveData 与 ViewModel 的 lifecycle 也依赖于 Lifecycle 框架。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-10 12:30:55  更:2021-11-10 12:33:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:46:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码