EventBus框架总结之用法
EventBus框架总结之源码分析
前面两篇对EventBus的使用以及实现源码进行了总结,这一篇主要对EventBus源码的修改实现支持泛型参数的总结。
EventBus也会有烦恼
在EventBus框架总结之用法中介绍时提到,当系统登录之后通过EventBus
发送一个LoginEvent
;在用户注册成功的时候,发送一个RegisterEvent
;那用户退出登录时,同样需要发送一个LogoutEvent
事件;当应用规模发展比较大的时候,每次需要通过EventBus
发送一个新的事件时,都需要新定义一个类,造成Event
类的泛滥,可能就是下面这个样子,
public class LoginEvent{}
public class LogoutEvent{}
public class RegisterEvent{}
...
可能中间有几十上百个类
...
public class AppExitEvent{}
对于大部分有代码洁癖的人来说,遇到这样的情况都是不能被接受的。这种情况下大家第一个会想到Java泛型,若要了解泛型原理,请查看Java泛型原理详解。
Java泛型真能实现吗?
我可以先告诉你,答案是不能够实现,不然也没有这篇文章的必要了。我们先来看看我们通常使用的情形,代码走起
public class LoginInfo{
}
public class RegisterInfo{
}
@Override
public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.login_success_text_view:
loginSuccess();
break;
case R.id.register_success_text_view:
registerSuccess();
break;
default:
break;
}
}
private void loginSuccess() {
LoginEvent event = new LoginEvent();
event.info = new LoginInfo();
EventBus.getDefault().post(event);
}
private void registerSuccess() {
RegisterEvent event = new RegisterEvent();
event.info = new RegisterInfo();
EventBus.getDefault().post(event);
}
@SuppressWarnings({
"unused","登陆成功之后回调"})
@Subscribe(threadMode = ThreadMode.MAIN)
public void onLoginSuccess(LoginEvent event) {
if(event.info != null) {
Toast.makeText(this, event.info.getInfo(), Toast.LENGTH_SHORT).show();
}
}
@SuppressWarnings({
"unused","注册成功之后回调"})
@Subscribe(threadMode = ThreadMode.MAIN)
public void onRegisterSuccess(RegisterEvent event) {
if(event.info != null) {
Toast.makeText(this, event.info.getInfo(), Toast.LENGTH_