jitpack之lifecycle原理

84 阅读1分钟

一、背景

我们在处理Activity或者Fragment组件的生命周期相关时,不可避免会遇到这样的问题:

我们在Activity的onCreate()中初始化某些成员(比如MVP架构中的Presenter,或者AudioManager、MediaPlayer等),然后在onStop中对这些成员进行对应处理,在onDestroy中释放这些资源,这样导致我们的代码也许会像这样:

class MyPresenter{
    public MyPresenter() {
    }
​
    void create() {
        //do something
    }
​
    void destroy() {
        //do something
    }
}
​
class MyActivity extends AppCompatActivity {
    private MyPresenter presenter;
​
    public void onCreate(...) {
        presenter= new MyPresenter ();
        presenter.create();
    }
​
    public void onDestroy() {
        super.onDestroy();
        presenter.destory();
    }
}
复制代码

代码没有问题,关键问题是,实际生产环境中 ,这样的代码会非常复杂,你最终会有太多的类似调用并且会导致 onCreate() 和 onDestroy() 方法变的非常臃肿。

二、lifecycle使用

只需要2步:

  • Prestener继承LifecycleObserver接口

    public class MyPresenter extends LifecycleObserver {
        @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
        void onCreate(@NotNull LifecycleOwner owner);
    ​
        @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
        void onDestroy(@NotNull LifecycleOwner owner);
    ​
        @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
        void onLifecycleChanged(@NotNull LifecycleOwner owner,
                                @NotNull Lifecycle.Event event);
    }
    
  • 在Activity/Fragment容器中添加Observer

    public class MainActivity extends AppCompatActivity {
        private IPresenter mPresenter;
    ​
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Log.d("tag", "onCreate" + this.getClass().toString());
            setContentView(R.layout.activity_main);
            mPresenter = new MainPresenter(this);
            getLifecycle().addObserver(mPresenter);//添加LifecycleObserver
        }
    ​
        @Override
        protected void onDestroy() {
            Log.d("tag", "onDestroy" + this.getClass().toString());
            super.onDestroy();
        }
    }
    

如此,每当Activity发生了对应的生命周期改变,Presenter就会执行对应事件注解的方法。

三、原理

  • Activity(Fragment )实现LifecycleOwner接口,并实现其抽象方法getLifecycle,返回Lifecycle的子类实例LifecycleRegistry。

  • 观察者实现LifecycleObserver接口,通过addObserver方法注册到被观察者里。

  • 当Activity(Fragment )生命周期发生改变,LifecycleRegistry调用handleLifecycleEvent逐个遍历通知每一个注册的LifecycleObserver ,并执行对应生命周期的方法。

    public class Fragment implements xxx, LifecycleOwner {
        //...
        void performCreate(Bundle savedInstanceState) {
            onCreate(savedInstanceState);  //1.先执行生命周期方法
            //...省略代码
            //2.生命周期事件分发
            mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
        }
    ​
        void performStart() {
            onStart();
            //...
            mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
        }
    }