1.介绍
首先,来简单的收一下Eventbus,它是一种专门针对Android优化的发布/订阅事件总线。简化了应用程序和各个组件之间与线程之间的通信。优点是开销小,代码少以及将发送者和接受者解耦。如果Activity与Activity之间互相交互的话还好一些,如果说Fragment和Fragment之间交互非常让人头痛,我们有可能会使用广播来处理,或者是setArguments()传递数据。但是这些种方法都是非常消耗时间代码都挺多的,效果而且也并不是很好。今天我们就来学习一下 Eventbus3.0 的使用方法。
2.概念
Eventbus的三要素
Event:事件,可以是任意类型的对象。
Subscriber:事件订阅者,在Eventbus3.0之前,消息处理的方法只能限定与onEvent,onEventMainThread,onEventBackgroundThread,onEventAsync,他们分别代表着四种四种线程模型。而在Eventbus3.0后,事件处理的方法可以随便取名,但是需要添加一个@Subscriber,并且添加指定的线程。
Publisher:事件发布者,可以在任意线程任意位置发送事件,直接调用Eventbus.getDefault.post(Object o)方法就可以发送事件根据post类型会自动订阅该类型的事件。
3.四种线程
- POSTING(默认):如果使用事件处理函数指定了线程模型为POSTING,那么该事件在哪个线程发布出来的,事件处理函数就会在这个线程中运行,也就是说发布事件和接收事件在同一个线程。在线程模型为POSTING的事件处理函数中尽量避免执行耗时操作,因为它会阻塞事件的传递,甚至有可能会引起ANR。
- MAIN:
事件的处理会在UI线程中执行。事件处理时间不能太长,长了会ANR的。 - BACKGROUND:如果事件是在UI线程中发布出来的,那么该事件处理函数就会在新的线程中运行,如果事件本来就是子线程中发布出来的,那么该事件处理函数直接在发布事件的线程中执行。在此事件处理函数中禁止进行UI更新操作。
- ASYNC:无论事件在哪个线程发布,该事件处理函数都会在新建的子线程中执行,同样,此事件处理函数中禁止进行UI更新操作。
4.Eventbus3.0的基本用法
导入依赖包
compile 'org.greenrobot:eventbus:3.0.0'
定义消息事件类
public class FirstEvent {
private String mMsg;
public FirstEvent(String msg) {
mMsg = msg;
}
public String getMsg(){
return mMsg;
}
}
在Mantivity中注册和取消事件
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
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;
public class MainActivity extends AppCompatActivity {
private Button btn;
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//注册事件
EventBus.getDefault().register(this);
btn = (Button) findViewById(R.id.btn);
tv = (TextView) findViewById(R.id.tv);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(MainActivity.this,Main2Activity.class);
startActivity(i);
}
});
}
//订阅事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMoonEvent(FirstEvent messageEvent){
tv.setText(messageEvent.getMsg());
}
//取消事件
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}
在Mantivity2中发送事件
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import org.greenrobot.eventbus.EventBus;
public class Main2Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
}
public void btnIn(View v){
//发送事件
EventBus.getDefault().post(new FirstEvent("AAAAAAAAAAAAAAAAAAA"));
finish();
}
}
实现效果:
主页面
进入主页面进行注册事件,点击跳转到第二个页面
点击传值,会发送事件,并且关闭当前页面
我们发送的对象里边就保存了一串这样的文字,这就是效果,就是这么简单。
5.Eventbus3.0的粘性事件
上边的讲法都很普通,Eventbus3.0还可以支持粘性事件,就是在发送该事件之后在订阅该事件也能收到该事件,对刚才的代码做一点修改
在Mantivity中依然注册事件,但是我们接受事件的方法不一样
@Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
public void onNianXing(FirstEvent firstEvent){
tv.setText(firstEvent.getMsg());
}
当然发送事件的行为也不一样
EventBus.getDefault().postSticky(new FirstEvent("黏性事件"));
实现的效果
点击订阅,开始发送粘性事件
在主页面接收到该事件显示在页面上
好了,小编就先写到这里了,后续会有更好的文章。