在我们开始之前,一定要将EventBus添加到您的项目中。
一,概述
上面这几行英文是给github官方给出的说法,那么我们翻译过来是大致就是说:
EventBus是一款针对Android优化的发布/订阅事件总线,简化了安卓事件之间的通信,可以替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅,质量更好。
下载EventBus的链接 https://github.com/greenrobot/EventBus
二,基本用法
这个图片可以很清晰的说明EventBus的执行流程,没当我不明白的时候,都会在看看这个流程图
EventBus in 3 steps
使用一共分为三个步骤
Step 1: Define events
Events are POJO (plain old Java object) without any specific requirements
//定义一个事件
public class MessageEvent { public final String message; public MessageEvent(String message) { this.message = message; } }
Step 2: Prepare subscribers
订阅者实现事件处理方法(也称为“订阅者方法”),当一个事件被发布时将被调用。这些都是用@subscribe注释定义的。
请注意,在EventBus 3中,方法名可以自由选择(在EventBus 2中不存在命名约定)。
请注意,在EventBus 3中,方法名可以自由选择(在EventBus 2中不存在命名约定)。
//准备一个订阅者
// This method will be called when a MessageEvent is posted (in the UI thread for Toast) @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(MessageEvent event) { Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show(); } // This method will be called when a SomeOtherEvent is posted @Subscribe public void handleSomethingElse(SomeOtherEvent event) { doSomethingWith(event); }
订阅者还需要register到总线上and unregister。只有在注册用户时,他们才会收到事件。在Android中, in activities and fragments,你应该根据他们的生命周期来注册。在大多数情况下,onStart/onStop更好用:
@Override public void onStart() { super.onStart(); EventBus.getDefault().register(this); } @Override public void onStop() { EventBus.getDefault().unregister(this); super.onStop(); }
Step 3: Post events
从您的代码的任何部分发布一个事件。所有与事件类型匹配的当前注册用户将接收它。
//发布一个事件
EventBus.getDefault().post(new MessageEvent("Hello everyone!"));
那么这个开源框架的使用也是很简单的,一共分为以上三个步骤,只要我们一步一步来,肯定是没有问题的,那么我们就先来做一个小的demo来试试, 任何大的项目都是小的知识点累加成的,只要我们掌握了每一个知识点,才能做好每一个大的项目。
三,实例
1 自定义一个类,可以是空的
public class TextEvent { public String msg; public TextEvent(String msg) { this.msg = msg; } }
2 准备一个订阅者 发送者,为了简单起见,我只是在主方法中定义了一个按钮
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //设置按钮的点击事件 findViewById(R.id.bt_post).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { TextEvent event = new TextEvent("Hello World"); EventBus.getDefault().post(event); } }); EventBus.getDefault().register(this); } /** * Declare your subscribing method * 声明自己的订阅方法 * * @param event */ @Subscribe public void onEvent(TextEvent event) { Toast.makeText(this, event.msg, Toast.LENGTH_SHORT).show(); } }简单来讲上面代码都做了些什么事情,首先在主方法中点击按钮之后,会发布一个事件,这个事件会调用下面我们声明的订阅方法,然后会在屏幕中弹出一个我们定义的土司
四,错误
我们在第一次使用的时候,很可能会出现像下面这个的报错,那么是为什么呢?
扫描二维码关注公众号,回复: 1744193 查看本文章仔细看这个错误,提示我们需要在回调的方法中加上一个注解
那么我们千万不能疏忽了,要在我们最后的回调方法上面加上那句注解,@Subscribe
05-06 23:38:38.622 9391-9391/? E/AndroidRuntime: FATAL EXCEPTION: main Process: com.itheima.demo, PID: 9391 java.lang.RuntimeException: Unable to start activity ComponentInfo {com.itheima.demo/com.itheima.demo.MainActivity}: org.greenrobot.eventbus.EventBusException: Subscriber class com.itheima.demo.MainActivity and its super classes have no public methods with the @Subscribe annotation
ps :
好了,那么这就是EventBus的简单实用,每当我们学习使用一个新的开源框架的时候,一定要从最简单的开始,看着官方给出的文档,一步一步来,肯定是可以搞定的。