EventBus是github上的一个第三方开源库,主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更简洁。
其在github上的项目地址为 https://github.com/greenrobot/EventBus
它的官方提供的关系图如上,是一个Publish/Subscribe模式,由消息的发布者post消息,订阅者去接收消息
Event:事件,可以是任意自定义类
Subscriber:事件订阅者,接收特定的事件
Publisher:事件发布者,通知Subscriber发送Event
首先在as的build.gradle中引用包
dependencies {
compile 'org.greenrobot:eventbus:3.0.0'
}
消息接受者用到以下函数
EventBus.getDefault().register(this);//订阅事件
EventBus.getDefault().unregister(this);//取消订阅
消息发布者用到post函数
EventBus.getDefault().post(object);//发布事件,object为自定义类
这里用activity和service之间通信为列子来看下实际使用方法
先写MainActivity作为事件的订阅者
布局文件
activity
package com.android.wwd.eventbusdemo;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
public class MainActivity extends AppCompatActivity {
private final String TAG = "demolog";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//注册监听
EventBus.getDefault().register(this);
Log.d(TAG,"mainTid = "+android.os.Process.myTid());
Button startButton = (Button)findViewById(R.id.start_service);
startButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,NewService.class);
startService(intent);
}
});
Button stopButton = (Button)findViewById(R.id.stop_service);
stopButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,NewService.class);
stopService(intent);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
//取消监听
EventBus.getDefault().unregister(this);
}
//接收订阅TestEvent事件的执行函数,当接收到发布者发布的TestEvent事件后会被调用
//这里有4种线程方式下面介绍
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(TestEvent event) {
Log.d(TAG,"onEventMainThread msg = "+event.getMessage());
}
@Subscribe(threadMode = ThreadMode.POSTING)
public void onEventPosting(TestEvent event) {
Log.d(TAG,"onEventPosting msg = "+event.getMessage());
}
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onEventBackgroundThread(TestEvent event){
Log.d(TAG,"onEventBackgroundThread msg = "+event.getMessage());
}
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onEventAsync(TestEvent event){
Log.d(TAG,"onEventAsync msg = "+event.getMessage());
}
}
自定义TestEvent,用来传递数据
public class TestEvent {
private String mMsg;
public TestEvent(String msg){
mMsg = msg;
}
public String getMessage(){
return mMsg;
}
}
4种threadMode的具体说明可以在http://greenrobot.org/eventbus/documentation/delivery-threads-threadmode/里查看。
ThreadMode.MAIN:会在主线程中执行函数
ThreadMode.POSTING:会在发布者的线程中执行函数
ThreadMode.BACKGROUND:如果发布者的线程不是主线程,则执行函数会在发布者的线程中执行。如果发布者线程是主线程,则执行函数会在后台进程中依次执行。
ThreadMode.ASYNC:在一个独立的线程中执行函数。
简单的总结下就是当你需要执行一个长时间的操作时最好用ThreadMode.ASYNC否则可能anr,如果要立即进行些UI操作可以用ThreadMode.MAIN。
消息的发布者service
package com.android.wwd.eventbusdemo;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import org.greenrobot.eventbus.EventBus;
public class NewService extends Service{
private final String TAG = "demolog";
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public void onStart(Intent intent, int startId) {
Log.d(TAG,"service PublisherTid = "+android.os.Process.myTid());
//在这里发布事件
EventBus.getDefault().post(
new TestEvent("EventBus push"));
super.onStart(intent, startId);
}
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
}
代码基本就这些,整个流程就是在作为订阅者的activity在oncreate中注册监听事件,然后点击button启动service,作为发布者的service启动之后发布事件。最后订阅者activity收到消息执行响应操作。
执行之后log如下
15:56:44.683 3826-3826/com.android.wwd.eventbusdemo D/demolog: onCreate mainTid = 3826
15:56:46.411 3826-3826/com.android.wwd.eventbusdemo D/demolog: service PublisherTid = 3826
15:56:46.419 3826-3826/com.android.wwd.eventbusdemo D/demolog: onEventMainThread msg = EventBus push
15:56:46.419 3826-3923/com.android.wwd.eventbusdemo D/demolog: onEventBackgroundThread msg = EventBus push
15:56:46.419 3826-3826/com.android.wwd.eventbusdemo D/demolog: onEventPosting msg = EventBus push
15:56:46.419 3826-3922/com.android.wwd.eventbusdemo D/demolog: onEventAsync msg = EventBus push