EventBus3.0使用
程序员文章站
2022-07-14 16:06:09
...
使用步骤
添加依赖库
compile 'org.greenrobot:eventbus:3.0.0'
定义消息事件类
public class MessageEvent {
//里面写你自己需要传递的参数
}
事件发送者:想要发送的地方发送
EventBus.getDefault().post(new MessageEvent(...);
事件订阅者:Activity/Fragment
//1.注册事件:一般在onCreate/onStart方法中
// ... ...
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// ...
EventBus.getDefault().register(this);
}
//2.取消订阅事件
@Override
protected void onDestroy() {
super.onDestroy();
//取消注册事件
EventBus.getDefault().unregister(this);
}
//3.事件订阅者处理事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMoonEvent(MessageEvent messageEvent){
//获取传递的值进行处理
messgetEvent.getXXX();
}
// ... ...
简单例子实践运用
添加依赖库
compile 'org.greenrobot:eventbus:3.0.0'
定义消息事件类
package com.wind.eventbus_demo;
//消息事件类
public class EventMessage {
String text;
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public EventMessage(String text) {
this.text = text;
}
}
接收者
package com.wind.eventbus_demo;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
/**
* 1.注册订阅
* 2.处理事件
* 3.取消订阅
*/
public class MainActivity extends AppCompatActivity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
//1.注册订阅
EventBus.getDefault().register(this);
}
//2.处理事件
@Subscribe(threadMode = ThreadMode.MAIN)
//参数必须和发送者传递的参数是一样的:发送的是EventMessage对象,接收也是EventMessage对象
public void getMessage(EventMessage eventMessage) {
String text = eventMessage.getText();
Log.e("MyLog", "MainActivity.getMessage: 接收者接收的文本: --->>> " + text);
}
@Override
protected void onDestroy() {
super.onDestroy();
//3.取消订阅
EventBus.getDefault().unregister(this);
}
private void initView() {
tv = (TextView) findViewById(R.id.tv);
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(MainActivity.this, Main2Activity.class));
}
});
}
}
发送者:
package com.wind.eventbus_demo;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import org.greenrobot.eventbus.EventBus;
public class Main2Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
}
@Override
public void onBackPressed() {
super.onBackPressed();
//点击返回的时候发送消息
EventBus.getDefault().post(new EventMessage("五把XXXXX"));
}
}
打印日志:
E/MyLog: MainActivity.getMessage: 接收者接收的文本: --->>> 五把XXXXX
在上面的例子中,我们再注解@Subscribe(threadMode = ThreadMode.MAIN)中使用了ThreadMode.MAIN这个模式,表示该函数在主线程即UI线程中执行,实际上EventBus总共有四种线程模式,分别是:
ThreadMode.MAIN:表示无论事件是在哪个线程发布出来的,该事件订阅方法onEvent都会在UI线程中执行,这个在Android中是非常有用的,因为在Android中只能在UI线程中更新UI,所有在此模式下的方法是不能执行耗时操作的。
ThreadMode.POSTING:表示事件在哪个线程中发布出来的,事件订阅函数onEvent就会在这个线程中运行,也就是说发布事件和接收事件在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。
ThreadMode.BACKGROUND:表示如果事件在UI线程中发布出来的,那么订阅函数onEvent就会在子线程中运行,如果事件本来就是在子线程中发布出来的,那么订阅函数直接在该子线程中执行。
ThreadMode.AYSNC:使用这个模式的订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程来执行订阅函数。