美文网首页
Lifecycle使用篇

Lifecycle使用篇

作者: Method | 来源:发表于2021-01-05 10:15 被阅读0次

    序言

    在应用开发中,处理Activity或者Fragment组件的生命周期相关代码是必不可免的,例如在MVP中Presenter层需要了解Activity的生命周期状态,否则当Activity关闭时可能会导致OOM,异常。所以需要一个能够管理Activity、fragment生命周期的库

    是什么

    Lifecycle 是 Jetpack 整个家族体系内最为基础的内容之一,正是因为有了 Lifecycle 的存在,使得如今开发者搭建依赖于生命周期变化的业务逻辑变得简单且高效了许多,使得我们可以以一种统一的方式来监听 Activity、Fragment、Service、甚至 Process 的生命周期变化,且大大减少了业务代码发生内存泄漏和 NPE 的风险。

    为什么用

    MVP中感知生命周期

     public class MainActivity extends AppCompatActivity {
        private MyPresenter myPresenter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            myPresenter = new MyPresenter();
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            myPresenter.onResume();
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            myPresenter.onPause();
        }
    }
    
    class MyPresenter{
        void onResume() {
        ...
        }
        void onPause() {
        ...
        }
    }
    

    实际开发中,可能会有多个组件在Activity的生命周期中进行回调,这样Activity的生命周期的方法中可能就需要放大量的代码,这就使得它们难以维护。

    还有一个问题是,如果我们在组件中做了耗时操作(比如在onStart方法),这种写法就无法保证组件在Activity或者Fragment停止之前完成启动。
    因此我们需要一个能管理Activity和Fragment的生命周期的库,这个库就是Lifecycle。

    怎么用

    基本使用

    OnLifecycleEvent形式

    该方法主要是面向基于 Java 7 作为编译版本的平台,但该方式在以后会被逐步废弃,Google 官方也建议开发者尽量使用接口回调的形式

    public class MyObserver implements LifecycleObserver {//1创建观察者
        @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
        public void connectListener() {
            ...
        }
    
        @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
        public void disconnectListener() {
            ...
        }
    }
    
    myLifecycleOwner.getLifecycle().addObserver(new MyObserver());//2添加观察者
    

    新建一个MyObserver类,它实现了LifecycleObserver接口,说明MyObserver成为了一个Lifecycle的观察者。
    然后在注释2处将MyObserver添加到LifecycleOwner中。LifecycleOwner是一个接口,其内部只有一个方法getLifecycle(),getLifecycle方法用于获取Lifecycle,这样就可以将MyObserver添加到Lifecycle中,当Lifecycle的生命周期发生变化时,MyObserver就会观察到,或者说是感知到。
    如果使用是Java8 ,那么可以使用DefaultLifecycleObserver来替代LifecycleObserver:

    class MyObserver implements DefaultLifecycleObserver {
         @Override
         public void onCreate(LifecycleOwner owner) {
             ...
         }
     }
    

    除此之外,不要忘了在build.gradle添加

    "androidx.lifecycle:common-java8:<version>"

    接口回调形式

    基于接口的形式(DefaultLifecycleObserver)来进行事件回调的,每当 Activity 的生命周期函数被触发时,该接口的相应同名函数就会在之前或者之后被调用,以此来获得相应生命周期事件变化的通知

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        lifecycle.addObserver(object : DefaultLifecycleObserver {
            override fun onCreate(owner: LifecycleOwner) {
    
            }
    
            override fun onResume(owner: LifecycleOwner) {
    
            }
    
            override fun onDestroy(owner: LifecycleOwner) {
                
            }
        })
    }
    
    

    MVP+Lifecycle

    public class MyPresenter implements IPresenter {
        private static final String TAG = "test";
    
        @Override
        public void onResume() {
            Log.d(TAG, "Lifecycle call onResume");
        }
    
        @Override
        public void onPause() {
            Log.d(TAG, "Lifecycle call onPause");
        }
    }
    
    interface IPresenter extends LifecycleObserver {
    
        @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
        void onResume();
    
        @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
        void onPause();
    }
    

    IPresenter接口继承自LifecycleObserver接口,MyPresenter又实现了IPresenter接口,这样MyPresenter成为了一个观察者。
    接在在MainActivity中加入MyPresenter:

    public class MainActivity extends AppCompatActivity {
    
        private static final String TAG = "test";
        private IPresenter mPresenter;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mPresenter = new MyPresenter();
            getLifecycle().addObserver(mPresenter);
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            Log.d(TAG, "onResume");
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            Log.d(TAG, "onPause");
    
        }
    }
    

    MainActivity成为了被观察者,当它的生命周期发生变化时,MyPresenter就可以观察到,这样就不需要在MainActivity的多个生命周期方法中调用MyPresenter的方法了。
    打印的日志如下:

    D/test: onResume

    D/test: Lifecycle call onResume

    D/test: Lifecycle call onPause

    D/test: onPause

    自定义LifecycleOwner

    如果想实现自定义LifecycleOwner,可以使用LifecycleRegistry,它是Lifecycle的实现类。Android Support Library 26.1.0及其之后的版本,Activity和Fragment已经默认实现了LifecycleOwner接口,因此我们可以这么写:

    public class MyActivity extends AppCompatActivity {
        private LifecycleRegistry lifecycleRegistry;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            lifecycleRegistry = new LifecycleRegistry(this);
            lifecycleRegistry.markState(Lifecycle.State.CREATED);
        }
    
        @Override
        public void onStart() {
            super.onStart();
            lifecycleRegistry.markState(Lifecycle.State.STARTED);
        }
    
        @NonNull
        @Override
        public Lifecycle getLifecycle() {
            return lifecycleRegistry;
        }
    }
    

    通过新建LifecycleRegistry,为LifecycleRegistry设置Lifecycle的各种状态,并通过getLifecycle方法返回该LifecycleRegistry。

    相关文章

      网友评论

          本文标题:Lifecycle使用篇

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