Android官方架构组件 Lifecycle 让你再也不会忘记清空资源

本文介绍如何使用Google推出的Lifecycle组件简化Activity及Fragment中的资源管理。通过实现LifecycleObserver接口并使用注解,可以自动清理资源,减少重复代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:为什么要引进Lifecycle?

在我们平常的开发工作中,当我们在一个Activity 或者Fragment 中初始化了一些资源(比如presenter ,handler ,MediaPlayer 等),然后在onDestroy 中对这些资源进行销毁工作,我们的代码就会变成这样

public class Presenter{
    
    public Presenter(){
        //doSomething
    }

    public void destroy(){
        //清空资源
     }
}

class MyActivity extends AppCompatActivity {
    private Presenter presenter;

    public void onCreate(...) {
        presenter= new Presenter ();
        presenter.create();
    }

    public void onDestroy() {
        super.onDestroy();
        if(presenter!=null){
        presenter.destory();
        }
    }
}

代码是对的,但是现在的问题是presenter 的销毁机制太重复了,我们基本上在每一个界面都需要相同的代码去销毁我们的presenter ,而且,在业务繁多的情况下,有可能还会忘掉写。所以,现在我向大家推荐一个Google 在2018开发者大会上推出的一系列新的架构组件之一的--Lifecycle

正文:Lifecycle 是什么?

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

简单的来说,就是它具有生命周期感知能力,能把涉及到Activity或者Fragment 生命周期的操作去抽象到一个类中去执行,而这个类只需要实现LifecycleObserver,然后使用注解标明在对应生命周期执行的方法。talk is cheap ,let me show you the code 

首先,添加依赖 

compile 'android.arch.lifecycle:extensions:1.0.0'
//presenter 的抽象类
public class BaseAbstractPresenter<T extends BaseView> implements  LifecycleObserver {
    protected CompositeDisposable compositeDisposable = new CompositeDisposable();
    public T mView;

    private LifecycleOwner lifecycleOwner;

    public BaseAbstractPresenter(T mView, LifecycleOwner lifecycleOwner) {
        this.mView = mView;
        this.lifecycleOwner = lifecycleOwner;
        lifecycleOwner.getLifecycle().addObserver(this);
    }

      //在清空资源的操作上加上   OnDestroy 生命周期的注解  
    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void detachView() { 
        if (compositeDisposable != null) { 
            compositeDisposable.dispose();
        }
        lifecycleOwner.getLifecycle().removeObserver(this);
    }

}
//Presenter 的实现类
public class MyPresenter extends BaseAbstractPresenter {

    public MyPresenter(BaseView mView, LifecycleOwner lifecycleOwner) {
        super(mView, lifecycleOwner);
    }

    
}

然后在Activity 中 
MyPresenter myPresenter = new MyPresenter(this, this);
就可以了

以下是 log 日志
03-30 15:09:48.318 29537-29537/app.vp.cn.profession I/生命周期: 清空资源,走了onDestroy 方法
03-30 15:09:48.320 29537-29537/app.vp.cn.profession I/生命周期: onDestroy 

这样,我们就简洁优雅的实现了自动清空资源的问题,当然,在任何需要控制生命周期的地方,这里都适用。

比方说这个handler

/**
 * author : by
 * date: 2019/3/26 0026  下午 6:03.
 * describe   自动清空资源的handler
 */

public class LifecycleHandler extends Handler implements LifecycleObserver {

    private LifecycleOwner lifecycleOwner;

    public LifecycleHandler(LifecycleOwner lifecycleOwner) {
        this.lifecycleOwner = lifecycleOwner;
        addObserver();
    }

    public LifecycleHandler(Callback callback, LifecycleOwner lifecycleOwner) {
        super(callback);
        this.lifecycleOwner = lifecycleOwner;
        addObserver();
    }

    public LifecycleHandler(Looper looper, LifecycleOwner lifecycleOwner) {
        super(looper);
        this.lifecycleOwner = lifecycleOwner;
        addObserver();
    }

    public LifecycleHandler(Looper looper, Callback callback, LifecycleOwner lifecycleOwner) {
        super(looper, callback);
        this.lifecycleOwner = lifecycleOwner;
        addObserver();
    }


    private void addObserver() {
        lifecycleOwner.getLifecycle().addObserver(this);
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    private void onDestroy() {
        removeCallbacksAndMessages(null);
        lifecycleOwner.getLifecycle().removeObserver(this);
    }
}

在Activity 中:
  //这里添加了一个不用回调清空缓存信息的handler  ,防止在activity结束的时候 忘记清空hanlder 的缓存
    LifecycleHandler lifecycleHandler = new LifecycleHandler(this) {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == 1) {
                Log.i("123", "收到信息" + msg.obj);
            }
        }
    };

 

另外说明一下,Lifecycle 给我们提供了常用的生命周期的注解,足够我们使用,:

 public enum Event {
        /**
         * Constant for onCreate event of the {@link LifecycleOwner}.
         */
        ON_CREATE,
        /**
         * Constant for onStart event of the {@link LifecycleOwner}.
         */
        ON_START,
        /**
         * Constant for onResume event of the {@link LifecycleOwner}.
         */
        ON_RESUME,
        /**
         * Constant for onPause event of the {@link LifecycleOwner}.
         */
        ON_PAUSE,
        /**
         * Constant for onStop event of the {@link LifecycleOwner}.
         */
        ON_STOP,
        /**
         * Constant for onDestroy event of the {@link LifecycleOwner}.
         */
        ON_DESTROY,
        /**
         * An {@link Event Event} constant that can be used to match all events.
         */
        ON_ANY
    }

 

好了,今天的文章就到这里,谢谢大家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值