EventBus是一款针对Android优化的发布/订阅 事件总线,简化了应用程序内各组件间、组件与后台线程间的通信。
主要是替代 handler BroadCast 在 Fragment 、Activity 、Service 线程之间传递消息。
EventBus 概述 1、EventBus 有三个主要的元素:
Event:事件,可以是任意类型的对象。
Subscriber:事件订阅者,在EventBus3.0之前消息处理的方法只能限定于onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync,他们分别代表四种线程模型。而在EventBus3.0之后,事件处理的方法可以随便取名,但是需要添加一个注解@Subscribe,并且要指定线程模型(默认为POSTING),四种线程模型下面会讲到。
Publisher:事件发布者,可以在任意线程任意位置发送事件,直接调用EventBus的post(Object)方法。可以自己实例化EventBus对象,但一般使用EventBus.getDefault()就好了,根据post函数参数的类型,会自动调用订阅相应类型事件的函数。
2、EventBus3.0有以下四种ThreadMode(线程模型):
POSTING(默认):发布事件和接收事件在同一个线程 ,也就是说该事件在哪个线程发布出来的,事件处理函数就会在这个线程中运行。
MAIN: 事件的处理总是在UI线程 中执行。
ASYNC:无论事件在哪个线程发布,该事件处理函数总是在新建的子线程 中执行,同样,此事件处理函数中禁止进行UI更新操作。
BACKGROUND:如果事件是在UI线程中发布出来的,那么该事件处理函数就会在新的线程中运行,如果事件本来就是子线程中发布出来的,那么该事件处理函数直接在发布事件的线程中执行。
EventBus 快速入门 0、首先为项目添加 EventBus 依赖:
compile 'org.greenrobot:eventbus:3.1.1'
1、定义事件类:
public static class MessageEvent { }
2、准备订阅者:
@Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent (MessageEvent event) {};
3、发送事件:
EventBus.getDefault().post(new MessageEvent ());
EventBus 实际应用 这里举例子具体介绍 EventBus 的用法,实现Activity之间传值。
1、定义消息事件类
package com.wshunli.eventbusdemo;public class MessageEvent { private String message; public MessageEvent (String message) { this .message = message; } public String getMessage () { return message; } public void setMessage (String message) { this .message = message; } @Override public String toString () { return "MessageEvent{" + "message='" + message + '\'' + '}' ; } }
2、注册和取消订阅事件
根据组件的声明周期,在 MainActivity.java 中注册/取消订阅事件。
package com.wshunli.eventbusdemo;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.TextView;import android.widget.Toast;import org.greenrobot.eventbus.EventBus;import org.greenrobot.eventbus.Subscribe;import org.greenrobot.eventbus.ThreadMode;public class MainActivity extends AppCompatActivity { private TextView textView; @Override protected void onCreate (Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); EventBus.getDefault().register(this ); findViewById(R.id.bt).setOnClickListener(new View .OnClickListener() { @Override public void onClick (View view) { startActivity(new Intent (MainActivity.this , SecondActivity.class)); } }); textView = findViewById(R.id.text); } @Override protected void onDestroy () { super .onDestroy(); EventBus.getDefault().unregister(this ); } }
3、添加消息处理函数
在 MainActivity.java 中添加事件的处理函数:
@Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent (MessageEvent event) { textView.setText(String.format("接收到发送的事件:%s" , event.getMessage())); }
我们选择 threadMode = ThreadMode.MAIN 表示总是在 主线程 中执行。
4、发布事件
在 SecondActivity 中发布事件:
package com.wshunli.eventbusdemo;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import org.greenrobot.eventbus.EventBus;public class SecondActivity extends AppCompatActivity { @Override protected void onCreate (Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_second); findViewById(R.id.bt).setOnClickListener(new View .OnClickListener() { @Override public void onClick (View view) { EventBus.getDefault().post(new MessageEvent ("来自SecondActivity的消息" )); finish(); } }); } }
5、接收到消息
在 MainActivity 接受到来自 SecondActivity 中发送的消息:
ProGuard 混淆规则 -keepattributes *Annotation* -keepclassmembers class ** { @org.greenrobot.eventbus.Subscribe <methods>; } -keep enum org.greenrobot.eventbus.ThreadMode { *; } # Only required if you use AsyncExecutor -keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent { <init>(java.lang.Throwable); }
参考资料 1、greenrobot/EventBus: Event bus for Android and Java that simplifies communication between Activities, Fragments, Threads, Services, etc. Less code, better quality.https://github.com/greenrobot/EventBus 2、Android事件总线(一)EventBus3.0用法全解析 - 刘望舒的专栏 - CSDN博客http://blog.csdn.net/itachi85/article/details/52205464 3、EventBus 3.0的用法详解(一) - neu - SegmentFaulthttps://segmentfault.com/a/1190000004279679 4、Android事件分发库的使用-慕课网https://www.imooc.com/learn/871