EventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。其实只要是一个Java类,都能使用EventBus来完成通信。简单地说:就是可以将某个页面想要传递的信息(例如在目标页面的textview中显示“hello world!”)简便且高效率地传递给目标页面。
代码实现:
EventBusActivity
package com.atguigu.android.eventbus;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.atguigu.android.R;
import com.atguigu.android.eventbus.event.MessageEvent;
import com.atguigu.android.eventbus.event.StickyEvent;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
// eventbus
public class EventBusActivity extends Activity {
private TextView tv_title;
private Button bt_eventbus_send;
private Button bt_eventbus_sticky;
private TextView tv_eventbus_result;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_event_bus);
initView();
initData();
initListener();
}
private void initListener() {
// 跳转到发送页面
bt_eventbus_send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(EventBusActivity.this, EventBusSendActivity.class);
startActivity(intent);
}
});
// 发送粘性事件到发送页面
bt_eventbus_sticky.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 2 发送粘性事件
EventBus.getDefault().postSticky(new StickyEvent("我是粘性事件"));
// 跳转到发送数据页面
Intent intent = new Intent(EventBusActivity.this, EventBusSendActivity.class);
startActivity(intent);
}
});
}
private void initData() {
tv_title.setText("EventBus");
// 1注册广播
EventBus.getDefault().register(EventBusActivity.this);
}
private void initView() {
tv_title = (TextView)findViewById(R.id.tv_title);
bt_eventbus_send = (Button)findViewById(R.id.bt_eventbus_send);
bt_eventbus_sticky = (Button)findViewById(R.id.bt_eventbus_sticky);
tv_eventbus_result = (TextView)findViewById(R.id.tv_eventbus_result);
}
// 5接收消息
@Subscribe(threadMode = ThreadMode.MAIN)
public void MesssageEventBus(MessageEvent event){
// 显示接收的消息
tv_eventbus_result.setText(event.name);
}
@Override
protected void onDestroy() {
super.onDestroy();
// 2 解注册
EventBus.getDefault().unregister(EventBusActivity.this);
}
}
EventBusSendActivity
package com.atguigu.android.eventbus;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.atguigu.android.R;
import com.atguigu.android.eventbus.event.MessageEvent;
import com.atguigu.android.eventbus.event.StickyEvent;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
// eventbus的发送数据页面
public class EventBusSendActivity extends Activity {
private TextView tv_title;
private Button bt_eventbus_send_main;
private Button bt_eventbus_send_sticky;
private TextView tv_eventbus_send_result;
boolean isFirstFlag = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_event_bus_send);
initView();
initData();
initListener();
}
private void initListener() {
// 主线程发送数据按钮点击事件处理
bt_eventbus_send_main.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 4 发送消息
EventBus.getDefault().post(new MessageEvent("主线程发送过来的数据"));
//post方法发送给的是在这之前已经register的的所有activity,若晚于post方法regsiter的activity则不会接收到数据
// 结束当前页面
finish();
}
});
// 接收粘性事件数据按钮的点击事件处理
bt_eventbus_send_sticky.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(isFirstFlag) {
isFirstFlag = false;
// 4 注册
EventBus.getDefault().register(EventBusSendActivity.this);//粘性事件就是在注册之前已经post了,但是依然可以获取到该事件。
}
}
});
}
// 3 接收粘性事件
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void StickyEventBus(StickyEvent event){
// 显示接收的数据
tv_eventbus_send_result.setText(event.msg);
}
private void initData() {
tv_title.setText("EventBus发送数据页面");
}
private void initView() {
tv_title = (TextView)findViewById(R.id.tv_title);
bt_eventbus_send_main = (Button)findViewById(R.id.bt_eventbus_send_main);
bt_eventbus_send_sticky = (Button)findViewById(R.id.bt_eventbus_send_sticky);
tv_eventbus_send_result = (TextView)findViewById(R.id.tv_eventbus_send_result);
}
@Override
protected void onDestroy() {
super.onDestroy();
// 5 解注册
EventBus.getDefault().removeAllStickyEvents();
EventBus.getDefault().unregister(EventBusSendActivity.this);
}
}
MessageEvent
package com.atguigu.android.eventbus.event;
// 3 创建发送消息类
public class MessageEvent {
public String name;
public MessageEvent(String name) {
this.name = name;
}
}
StickyEvent
package com.atguigu.android.eventbus.event;
// 1创建一个粘性事件类
public class StickyEvent {
public String msg;
public StickyEvent(String msg) {
this.msg = msg;
}
}
总结: