响应组件的生命周期

响应组件的生命周期

MVP模式中,常需要在Presenter里响应Activity或者Fragment的生命周期,对应做一些处理。比如在Presenter里发起了一个网络请求,请求还在进行,而用户点击了返回按钮要退出当前Activity,这时最好能在Presenter中取消当前请求,也就是说,要在Presenter中响应ActivityonDestroy方法,在Activity销毁时取消仍在进行的网络请求。

如果我们要自己来实现上面的需求,并不困难,只是用起来比较麻烦。现在,谷歌官方推出了一个Lifecycle组件,非常简单易用。其所在的包名为:android.arch.lifecycle,其中需要重点关注的几个类或者接口如下:

  • 抽象类Lifecycle
  • LifecycleRegistry
  • 接口LifecycleOwner
  • 接口LifecycleObserver
Lifecycle抽象类

Lifecycle类中定义了组件的生命周期参数并提供了让其它对象来观察当前组件状态的方法addObserver(LifecycleObserver observer)
Lifecycle类中使用两个枚举类型EventState来定义组件的生命周期其当前状态。

  • Event 枚举参数对应于ActivityFragment的生命周期回调方法
    public enum Event {
        ON_CREATE,
        ON_START,
        ON_RESUME,
        ON_PAUSE,
        ON_STOP,
        ON_DESTROY,
        ON_ANY
    }
  • State 枚举参数对应于当前组件的生命状态
    public enum State {
        DESTROYED,
        INITIALIZED,
        CREATED,
        STARTED,
        RESUMED;
        public boolean isAtLeast(@NonNull State state) {
            return compareTo(state) >= 0;
        }
    }

State和Event关系类似于下图
这里写图片描述

LifecycleOwner接口

LifecycleOwner接口中只定义了一个方法getLifecycle(),通过这个方法可以获取到一个Lifecycle对象。如果组件想拥有Lifecycle中定义的生命周期,就需要实现LifecycleOwner接口,目前AppCompatActivityFragment都已经实现了这个接口,因此在Activity或Fragment中可以直接调用getLifecycle方法。

LifecycleObserver

当一个类实现了LifecycleObserver接口,就能通过Lifecycle.add(LifecycleObserver observer)方法把它添加为观察对象。就可以在该类中观察组件的生命周期。比如定义一个BasePresenter类,让它实现LifecycleObserver接口,就能通过注解获取被观察组件的生命周期回调,代码如下:

public class BasePresenter implements LifecycleObserver{
    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void onCreate(){};

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void onStart(){};

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void onResume(){};

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void onPause(){};

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void onStop(){};

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void onDestroy(){};
}

然后在AppCompatActivity中,初始化BasePresenter并通过Lifecycle.addObserver(LifecycleObserver observer)方法把BasePresenter添加为观察者,那么在BasePresenter中就能获取到当前Activity的所有生命周期回调。代码如下:

    private TestPresenter mPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mPresenter = new TestPresenter();
        getLifecycle().addObserver(mPresenter);
    }

这里的TestPresenter是继承自BasePresenter的,代码如下:

public class TestPresenter extends BasePresenter {
    private static final String TAG = "TestPresenter";

    @Override
    public void onCreate() {
        super.onCreate();
        Log.e(TAG, "onCreate");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.e(TAG, "onDestroy");
    }
}

TestPresenter里只实现了两个方法,只监听了onCreateonDestroy。代码运行后,启动并退出被观察的Activity,打印结果如下:

05-10 16:19:28.902 /xiaoqiang.com.trysomething E/TestPresenter: onCreate
05-10 16:19:31.222 /xiaoqiang.com.trysomething E/TestPresenter: onDestroy
LifecycleRegistry

通过上面的讲解,我们已经知道了如何让其它对象监听Activity或者Fragment的生命周期,然而难道我们只能监听ActivityFragment吗?当然不是的,有了LifecycleOwner,我们就能给任何对象添加或者说定义生命周期,然后通过LifecycleObserver去监听它。而要给一个对象添加生命周期,就需要用到LifecycleRigistry类。
其使用方法如下:

public class CustomLifecycle implements LifecycleOwner{

    private LifecycleRegistry mLifecycleRegistry;
    TestPresenter presenter;

    public CustomLifecycle(){
        mLifecycleRegistry = new LifecycleRegistry(this);

        presenter = new TestPresenter();
        getLifecycle().addObserver(presenter);
    }

    public void start(){
        mLifecycleRegistry.markState(Lifecycle.State.CREATED);
    }

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

    public void doRecycle(){
        mLifecycleRegistry.markState(Lifecycle.State.DESTROYED);
    }
}

CustomLifecycle类中定义了两个方法start()doRecycle(),然后通过LifecycleRigistry.markState(State state)方法分别将它们标记为生命周期的CREATED阶段和DESTROYED阶段,这样,CustomLifecyle类就拥有了两个生命周期方法,根据上面的EventState关系图,当CustomLifecycle调用start()方法时,Lifecycle.Event.ON_CREATE就会响应,当调用doRecycle()方法时,Lifecycle.Event.ON_DESTROY就会响应。

仍然使用TestPresenter来监听生命周期,初始化CustomLifecyle类,依次调用start()doRecycle()方法:

    private void tryLifecycle(){
        CustomLifecycle lifecycle = new CustomLifecycle();
        lifecycle.start();
        new Handler().postDelayed(()-> lifecycle.doRecycle(), 1000);
    }

日志打印结果如下:

05-10 16:53:44.142 /xiaoqiang.com.trysomething E/TestPresenter: onCreate
05-10 16:53:45.152 /xiaoqiang.com.trysomething E/TestPresenter: onDestroy

使用官方这套Lifecycle组件,可以让任意对象轻松实现对ActivityFragment生命周期的监听。同时也能给任意对象赋予生命周期并实现对其生命周期的监听,用起来简直不要太方便。

Lifecycle官网地址

猜你喜欢

转载自blog.csdn.net/chenrenxiang/article/details/80271544