EventBus注销的必要性,用实例说明为什么EventBus用完必须注销

本文通过实例演示了在Android开发中使用EventBus时,如果不正确地注销订阅事件会导致事件重复执行的问题。文章详细解释了为何即使退出Activity,未注销的订阅事件仍会保留在内存中,并给出了解决方案。

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

//我们知道eventbus非粘性订阅事件在退出时都需要进行注销,否则会出现异常。那么到底会出现什么异常呢?
//下面我们用具体的实例来看一下。
package com.demo.staticman.eventbusdemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        EventBus.getDefault().register(this);
        EventBus.getDefault().post(new TestEvent());
    }

    @Subscribe(threadMode = ThreadMode.POSTING)
    public void printLog(TestEvent testEvent) {
        Log.i("测试订阅事件的次数", "执行了");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();//这里我们不进行eventbus订阅事件的注销
    }
}
 
我们第一次进入MainActivity时控制台log输出为下图所示:

可以看到订阅事件只执行了一次,那么我们现在退出MainActivity,清空控制台并再次进入,控制台输出为下图:

这里我们可以看到订阅事件被执行了两次,因为第一次注册的订阅事件未被注销,所以一直存在于进程中,我们
第三次进入打印结果为下图:


所以我们可以得出结论,若EventBus未被注销,那么会导致订阅事件的重复执行。

可能会有同学感到疑问,为什么MainActivity退出了,也就是说整个App都推出了,EventBus订阅事件还会存在于内存中呢,
这里科普一下,我们的确是退出了MainActivity,然而注意我们就只是退出了这个Activity,这个与在App中退出其他
Activity无异,并不能结束整个进程,而EventBus是全局的,这也就是为什么EventBus可以从任意一个角落传递任意事件到
另外的任意一个角落,所以仅仅退出应用并不能销毁全局变量。若我们在onDestroy中主动杀死进程,就可以销毁所有的全局
变量了。即:
@Override
protected void onDestroy() {
    super.onDestroy();//这里我们不进行eventbus订阅事件的注销
    android.os.Process.killProcess(android.os.Process.myPid());//在这里杀死进程
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值