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