EventBus使用详解(一)——初步使用EventBus
EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。
EventBus 源码地址:https://github.com/greenrobot/EventBus
一、EventBus 的基本用法
EventBus 使用起来分为5个步骤
1. 自定义一个事件
package com.yoyozhangh.github.eventbusdemo;
/**
* 定义消息事件类
*/
public class MessageEvent {
private String message;
public MessageEvent(String message) {
this.message = message;
}
public void setMessage(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}
2.在需要订阅的地方注册事件
// 注册事件
EventBus.getDefault().register(MainActivity.this);
3.发送事件
//发送事件
EventBus.getDefault().post(new MessageEvent("欢迎关注 yoyozhangh 的博客"));
4.处理事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMoonEvent(MessageEvent messageEvent) {
tv_message.setText(messageEvent.getMessage());
}
5.取消事件订阅
//取消注册事件
EventBus.getDefault().unregister(MainActivity.this);
顺序就是这么个顺序,可真正让自己写,估计还是云里雾里的,下面举个例子来说明下。
首先,在EventBus中,获取实例的方法一般是采用EventBus.getDefault()来获取默认的EventBus实例,当然你也可以new一个又一个,个人感觉还是用默认的比较好,以防出错。
二、EventBus的应用举例
1,添加依赖库
implementation 'org.greenrobot:eventbus:3.0.0'
2,定义消息事件类
package com.yoyozhangh.github.eventbusdemo;
/**
* 定义消息事件类
*/
public class MessageEvent {
private String message;
public MessageEvent(String message) {
this.message = message;
}
public void setMessage(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}
3,注册和取消订阅事件
package com.yoyozhangh.github.eventbusdemo;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import org.w3c.dom.Text;
public class MainActivity extends AppCompatActivity {
TextView tv_message;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_message = (TextView) findViewById(R.id.tv_message);
Button mSubButton = (Button) findViewById(R.id.bt_subscription);
mSubButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 注册事件
EventBus.getDefault().register(MainActivity.this);
}
});
Button mSecondActivityButton = (Button) findViewById(R.id.bt_message);
mSecondActivityButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//启动 secondActivity
startActivity(new Intent(MainActivity.this, SecondActivity.class));
}
});
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMoonEvent(MessageEvent messageEvent) {
tv_message.setText(messageEvent.getMessage());
}
@Subscribe(threadMode = ThreadMode.POSTING,sticky = true)
public void ononMoonEvent(MessageEvent messageEvent){
tv_message.setText(messageEvent.getMessage());
}
@Override
protected void onDestroy() {
super.onDestroy();
//取消注册事件
EventBus.getDefault().unregister(MainActivity.this);
}
}
4,事件订阅者处理事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMoonEvent(MessageEvent messageEvent) {
tv_message.setText(messageEvent.getMessage());
}
@Subscribe(threadMode = ThreadMode.POSTING,sticky = true)
public void ononMoonEvent(MessageEvent messageEvent){
tv_message.setText(messageEvent.getMessage());
}
5,事件发布者发布事件
package com.yoyozhangh.github.eventbusdemo;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import org.greenrobot.eventbus.EventBus;
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Button mSendButton = (Button)findViewById(R.id.bt_send);
mSendButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//发送事件
EventBus.getDefault().post(new MessageEvent("欢迎关注 yoyozhangh 的博客"));
finish();
}
});
Button mStickyButton = (Button) findViewById(R.id.bt_send_stick_event);
mStickyButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//发送 sticky 事件
EventBus.getDefault().postSticky(new MessageEvent("黏性事件"));
finish();
}
});
}
}
6,混淆规则添加
-keepattributes *Annotation*
-keepclassmembers class * {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
}
其他
demo源码地址 :https://download.youkuaiyun.com/download/yoyo_0316/10571154