//我们知道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());//在这里杀死进程 }
EventBus注销的必要性,用实例说明为什么EventBus用完必须注销
最新推荐文章于 2024-08-13 10:45:54 发布