EventBus作用:
简化组件之间的通信,可用于线程间的通讯代替handler,用于组件间的通讯代替Intent,用于Activity和Fragment之间通信。
使得代码更简洁,性能更好。
EventBus使用方法:
一、导入jar包
gradle:
compile 'org.greenrobot:eventbus:3.1.1'
也可下载jar包导入(可在EventBus 的GitHub上找到,3.1.1版本的jar包文末下载的代码中,libs文件夹中找到)
二、 java代码中使用步骤
1. 注册事件订阅者
//1.注册 EventBus
EventBus.getDefault().register(this);
2. 发送方发送事件
//MessageBean 为自己随便定义的一个实体类
MessageBean messageBean = new MessageBean();
messageBean.title = "MessageBean Title";
messageBean.text = "MessageBean Text Content";
//2. 发送消息
// 如果是发送粘性消息,使用 EventBus.getDefault().postSticky(event) 发送
EventBus.getDefault().post(messageBean);
3. 接收方接收事件
/**
* 3.接收消息 方法名可随便写,只需加上注解即可<br/>
* 3.1 ThreadMode取值,及其意义
* POSTING (默认) 表示事件处理函数的线程跟发布事件的线程在同一个线程。
* MAIN 表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。
* BACKGROUND 表示事件处理函数的线程在后台线程,因此不能进行UI操作。
* 如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,
* 如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。
* ASYNC 表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作。
*
* 3.2 priority:优先级
* 优先级则为一个1000以内的整数,优先级高的可以拦截事件向下传递
* EventBus.getDefault().cancelEventDelivery(event) ;
*
* 3.3 stick:是否为粘性事件,默认false
* 粘性事件可以先发送事件,再注册监听
*
* @param message
*/
@Subscribe(threadMode = ThreadMode.MAIN,priority = 100,sticky = false) //在ui线程执行,优先级为100
public void onEvent(MessageBean message){
tv1.setText(message.title);
tv2.setText(message.text);
}
4. 解注册事件订阅者
//4.解注册EventBus,防止内存泄露
EventBus.getDefault().unregister(this);
其中,事件的类名,类结构,接收事件的方法名,都可随便定义。
三、 使用示例
1. 第一个界面 MainActivity.java
实现 注册事件订阅者,接收方接收事件,解注册事件订阅者 三个步骤
发送事件由第二个界面实现。
package com.test.activity;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import com.example.eventbustest.R;
import com.test.bean.MessageBean;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity{
private Button startNewActivity;
private TextView tv1,tv2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv1 = (TextView) findViewById(R.id.textView1);
tv2 = (TextView) findViewById(R.id.textView2);
startNewActivity = (Button) findViewById(R.id.start_new_activity);
/**
* 按钮点击事件,跳转到一个新的页面
* 新的页面中演示通过EventBus发送消息
*/
startNewActivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
//1.注册 EventBus
EventBus.getDefault().register(this);
}
/**
* 3.接收消息 方法名可随便写,只需加上注解即可<br/>
* 3.1 ThreadMode取值,及其意义
* POSTING (默认) 表示事件处理函数的线程跟发布事件的线程在同一个线程。
* MAIN 表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。
* BACKGROUND 表示事件处理函数的线程在后台线程,因此不能进行UI操作。
* 如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,
* 如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。
* ASYNC 表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作。
*
* 3.2 priority:优先级
* 优先级则为一个1000以内的整数,优先级高的可以拦截事件向下传递
* EventBus.getDefault().cancelEventDelivery(event) ;
*
* 3.3 stick:是否为粘性事件,默认false
* 粘性事件可以先发送事件,再注册监听
*
* @param message
*/
@Subscribe(threadMode = ThreadMode.MAIN,priority = 100,sticky = false) //在ui线程执行,优先级为100
public void onEvent(MessageBean message){
tv1.setText(message.title);
tv2.setText(message.text);
}
@Override
protected void onDestroy() {
//4.解注册EventBus,防止内存泄露
EventBus.getDefault().unregister(this);
super.onDestroy();
}
}
2. 第二个界面 SedondActivity.java
实现 发送方发送事件
package com.test.activity;
import org.greenrobot.eventbus.EventBus;
import com.example.eventbustest.R;
import com.test.bean.MessageBean;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class SecondActivity extends Activity{
private Button sendMessage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
sendMessage = (Button) findViewById(R.id.send_message);
sendMessage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MessageBean messageBean = new MessageBean();
messageBean.title = "MessageBean Title";
messageBean.text = "MessageBean Text Content";
//2. 发送消息
// 如果是发送粘性消息,使用 EventBus.getDefault().postSticky(event) 发送
EventBus.getDefault().post(messageBean);
}
});
}
}
3. 事件实体类
package com.test.bean;
/**
* 事件实体类<br/>
* 类的名称,结构都可灵活变动<br/>
* 仅做示例使用,实际项目中如果不需要,也可不写这个类
* @author Administrator
*
*/
public class MessageBean {
public String title;
public String text;
}
示例代码下载地址:
http://download.csdn.net/download/qq_34763699/10273749
百度网盘 https://pan.baidu.com/s/1A7k7ezf7u9ckhsc2SoRGnA