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

//我们知道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());//在这里杀死进程
}
 
 

你可能感兴趣的:(第三方框架工具)