一、概述
我也是刚学Andriod不久,只知道Intent、Handler、Messenger、广播、还有回调方法,前几天在看博客的时候发现了EventBus。
EventBus是[greenrobot](http://greenrobot.org/)公司为Android推出的一款开源的库,它使用发布者/订阅者模式来解决解耦问题。它可以通过简单的几行代码实现无关类之间的相互通信,消除了依赖,加速了应用程序的开发速度。
**原文:**
EventBus is an open-source library for Android using the
publisher/subscriber pattern to solve the problem of loose coupling.
EventBus enables central communication to decoupled classes with just
a few lines of code simplifying the code, removing dependencies, and
speeding up app development.
**简单概括一下EventBus的两个基本用途:
1.用于Android四大组件的通信
2.用于线程间的通信**
二、基本的使用
先写个简单的例子,看一下EventBus到底如何使用。对案例的功能的简单描述:
在后台开启一个Service生成一个字符串,在Activity上显示出来。好了,贴代码。
1.自定义一个事件类的代码:
这个类的作用类似于Message,携带需要传递的数据。
/**
* 定义一个类,包含一个字符串
* 这个字符串就是我们要传递的数据
* @author yqm
*/
public class MyEvent {
private String text;
public String getText() {
return text;
}
public MyEvent(String text) {
this.text = text;
}
}
MainActivity的布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.eventbus.MainActivity" >
<TextView
android:id="@+id/main_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textSize="30sp"
android:text="随机字符串" />
</RelativeLayout>
MainActivity的代码:
这里的Activity就是一个事件的订阅者,通过EventBus的register(object)方法将自己(this)传进去,实现事件的订阅。
package com.example.eventbus;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
/**
* Acttivity(是一个订阅者)
*
* @author yqm
*
*/
public class MainActivity extends Activity {
private TextView tv_main;
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_main = (TextView) findViewById(R.id.main_tv);
intent = new Intent(this, MyService.class);
// 1.注册EventBus
EventBus.getDefault().register(this);
// 启动服务
startService(intent);
}
// 显示view(注意这里的注解)
@Subscribe(threadMode = ThreadMode.MAIN)
public void getStringFromServiceAndDisplay(MyEvent event) {
// 取出传递过来的字符串
String text = event.getText();
// 设置TextView
tv_main.setText(text);
}
@Override
protected void onDestroy() {
super.onDestroy();
// 2.解除注册
EventBus.getDefault().unregister(this);
// 停止Service
stopService(intent);
}
}
MyService的代码:*强调内容*
Service在这里充当事件的发布者。
package com.example.eventbus;
import org.greenrobot.eventbus.EventBus;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class MyService extends Service {
public static final String STR = "QWERTYUIOPASDFGHJKLZXCVBNM";
@Override
public IBinder onBind(Intent intent) {
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 启动一个工作线程不断发送字符串
new Thread() {
public void run() {
while (true) {
// 获取一个长度为4的字符串
String text = getRandomString(4);
//将携带字符串的事件发出
EventBus.getDefault().post(new MyEvent(text));
//休眠半秒
try {
sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
}.start();
return super.onStartCommand(intent, flags, startId);
}
/**
* 产生一个字符串
*
* @param lenth
* @return
*/
private String getRandomString(int lenth) {
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < lenth; i++) {
int index = (int) (Math.random() * STR.length());
buffer.append(STR.charAt(index));
}
return buffer.toString();
}
}
实现效果:
根据以上的代码,就可以总结出使用EventBus的基本步骤了:
1)编写一个Event类,名字随意。
2)在订阅者中进行EventBus 的注册、Event的接收以及EventBus的反注册。
3)在发布者中进行执行post()将事件发送出去。
以上仅为代码的编写步骤,具体执行顺序稍后再说。
三、EventBus原理的简单解析
通过上面的例子,我们已经学会了EventBus的简单应用。
那么它的原理是什么呢?
特点:
1.发布者和订阅者并没有直接的联系。发布者根本就不知道将来这个事件的接受者是谁;订阅者也不知道事件是谁发布的。
2.订阅者执行EventBus.getDefault().register(this)的过程,可以理解为订阅者进行事件到 订阅,注意,注册过程并没有明确的指出到底要订阅那种Event。
3.发送Event的EventBus和注册时的EventBus要是同一个。
4.和旧版本的EventBus相比,3.0版的EventBus的响应方法(订阅者中接收Event的方法),名字已经不再局限于onEventXxx(),采用了更加灵活的注解方式进行判断,该方法究竟在什么场合执行。