Mvvm之Lifecycle解析

作者: 奔跑吧李博 | 来源:发表于2020-08-03 12:05 被阅读0次
为什么要引进Lifecycle?

因为我们在Activity,fragment中使用某些成员变量时,需要保持与组件生命周期同步,就不免会增加多个onStop,onDestroy的回调方法,导致文件臃肿。

Lifecycle是什么

Lifecycle是Google官方提供的方便管理生命周期事件的方式,可以更方便的监听生命周期变化事件,它以注解的方式作用在方法上,当生命周期方法调用时,它也会被跟随调用。

Lifecycle是一个抽象类,它持有关于组件(如Activity 或 Fragment)生命周期状态的信息,并且允许其他对象观察此状态。

public abstract class Lifecycle {

 
    AtomicReference<Object> mInternalScopeRef = new AtomicReference<>();

    @MainThread
    public abstract void addObserver(@NonNull LifecycleObserver observer);

    @MainThread
    public abstract void removeObserver(@NonNull LifecycleObserver observer);

    @MainThread
    @NonNull
    public abstract State getCurrentState();

    @SuppressWarnings("WeakerAccess")
    public enum Event {

        ON_CREATE,

        ON_START,

        ON_RESUME,

        ON_PAUSE,

        ON_STOP,

        ON_DESTROY,

        ON_ANY
    }

    @SuppressWarnings("WeakerAccess")
    public enum State {

        DESTROYED,

        INITIALIZED,

        CREATED,

        STARTED,

        RESUMED;
    }
}
使用lifecycle监听Activity生命周期示例:

创建接口LifeCycleObserver继承LifecycleObserver接口:

public interface LifeCycleObserver extends LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    void onCreate( LifecycleOwner owner);

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    void onResume(LifecycleOwner owner);

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    void onStop(LifecycleOwner owner);

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    void onDestroy( LifecycleOwner owner);

    @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
    void onLifecycleChanged(LifecycleOwner owner,
                            Lifecycle.Event event);

}

实现接口监听到生命周期方法。

public class LifecycleObserverImp implements LifeCycleObserver {

    @Override
    public void onLifecycleChanged(LifecycleOwner owner, Lifecycle.Event event) {

    }

    @Override
    public void onCreate(LifecycleOwner owner) {
        Log.i("minfo", "onCreate");
    }

    @Override
    public void onResume(LifecycleOwner owner) {
        Log.i("minfo", "onResume");
    }

    @Override
    public void onStop(LifecycleOwner owner) {
        Log.i("minfo", "onStop");
    }

    @Override
    public void onDestroy(LifecycleOwner owner) {
        Log.i("minfo", "onDestroy");
    }
}

通过getLifecycle()方法获取内部的Lifecycle对象,添加生命周期观察者。

getLifecycle().addObserver(new LifecycleObserverImp());

打印事件:

I/minfo: onCreate
I/minfo: onResume
I/minfo: onStop
I/minfo: onDestroy
示例分析:

LifecycleOwner(Lifecycle持有者):实现该接口的类持有生命周期(Lifecycle对象),该接口的生命周期(Lifecycle对象)的改变会被其注册的观察者LifecycleObserver观察到并触发其对应的事件。

LifecycleObserver( Lifecycle观察者):实现该接口的类,通过注解的方式,可以通过被LifecycleOwner类的addObserver(LifecycleObserver o)方法注册,被注册后,LifecycleObserver便可以观察到LifecycleOwner的生命周期事件。

State:当前生命周期所处状态

Event:当前生命周期改变对应的事件

LifecycleOwner实现:

@SuppressWarnings({"WeakerAccess", "unused"})
public interface LifecycleOwner {
    @NonNull
    Lifecycle getLifecycle();
}

组件中获取LifecycleOwner,LifecycleRegistry对象继承了Lifecycle。

public class ComponentActivity implements LifecycleOwner {
 
       private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
 
    @Override
    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }

当LifecycleRegistry 本身的生命周期改变后(可以想象,内部一定有一个成员变量State记录当前的生命周期),LifecycleRegistry 就会逐个通知每一个注册的LifecycleObserver ,并执行对应生命周期的方法。

相关文章

网友评论

    本文标题:Mvvm之Lifecycle解析

    本文链接:https://www.haomeiwen.com/subject/tlpvrktx.html