http://greenrobot.org/eventbus/documentation/官方学习文档
http://greenrobot.org/
EventBus是Android下高效的发布/订阅事件总线机制。作用是可以代替传统的Intent,Handler,Broadcast或接口函数在Fragment,Activity,Service,线程之间传递数据,执行方法。特点是代码简洁,是一种发布订阅设计模式(Publish/Subsribe),或称作观察者设计模式。
在实际开发中经常遇到这样情况
1、activity之间传递数据
2、activity与fragment,fragment与fragment之间传递数据
3、activity与service之间传递数据
4、activiity与broadcast之间传递数据
如果按照android api可能要写很多代码,有时候还要携带context对象,并且很多时间传递给activity后要刷新ui。eventbus帮我们做了大量的这样的工作,代码简介,使用订阅/发布。
EventBus属于greenrobot出品,被收录google Guava库,Guava库有很多强大好用的东西
com.google.common.annotations
com.google.common.base
com.google.common.base.internal
com.google.common.cache
com.google.common.collect
com.google.common.eventbus
com.google.common.io
com.google.common.net
com.google.common.primitives
com.google.common.util.concurrent
在当前流行的retrofit(okhttp)网络库,不仅支持rxjava,java8,还有就是guava库,可以学习一下。
另外greenrobot出口另一个greendao数据库项目也非常好用
在项目中使用eventbus+greendao非常方便
eventbus 使用依赖
compile 'de.greenrobot:eventbus:3.0.0-beta1'
订阅就是需要接收方,好像的们订阅的报纸,当有了报纸的时候,快递员就会向我们订阅方送报。比如在这是MainActivity了订阅方。
在这里主要做两件事
一是订阅注册,与取消
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
}
取消订阅
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
二是订阅事件
就是当订阅发布后,我们在这里做出相应的事件,比如接收数据,更新UI,或者做其他处理。
在这收到发布的信息后,在主线程中设置textview的值,弹出Toast。
//收到ObjActivity中的数据
@Subscribe(threadMode = ThreadMode.MainThread)
public void myEventBusObj(MyEvent myEvent) {
text.setText(myEvent.getStr());
Toast.makeText(this, myEvent.getStr(), Toast.LENGTH_SHORT).show();
}
public class ObjActivity extends AppCompatActivity {
private Button btn_send;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_obj);
btn_send= (Button) findViewById(R.id.send_obj);
btn_send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
EventBus.getDefault().post(new MyEvent("222"));
}
});
}
}
通过MyEvent类发送,也可以简单的只发送一条Message。
public class MyEvent {
private String str;
public MyEvent(String str){
this.str=str;
}
public String getStr() {
return str;
}
}
在MainActivity中为订阅者,注册事件,接收事件
package com.example.eventbus;
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 android.widget.Toast;
import de.greenrobot.event.EventBus;
import de.greenrobot.event.Subscribe;
import de.greenrobot.event.ThreadMode;
import event.MyEvent;
import event.PersonEvent;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn_str;
private Button btn_obj;
private Button btn_person;
private TextView text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
btn_str = (Button) findViewById(R.id.btn_str);
btn_obj= (Button) findViewById(R.id.btn_obj);
btn_person= (Button) findViewById(R.id.btn_person);
text = (TextView) findViewById(R.id.text);
btn_str.setOnClickListener(this);
btn_obj.setOnClickListener(this);
btn_person.setOnClickListener(this);
}
@Override
public void onClick(View view) {
Intent intent;
switch (view.getId()) {
case R.id.btn_str:
intent = new Intent();
intent.setClass(MainActivity.this, StrActivity.class);
startActivity(intent);
break;
case R.id.btn_obj:
intent = new Intent();
intent.setClass(MainActivity.this, ObjActivity.class);
startActivity(intent);
break;
case R.id.btn_person:
intent = new Intent();
intent.setClass(MainActivity.this, PersonActivity.class);
startActivity(intent);
break;
}
}
//收到StrActivity中的字符串数据
@Subscribe(threadMode = ThreadMode.MainThread)
public void myEventBusStr(String message) {
text.setText(message + "");
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
//收到ObjActivity中的数据
@Subscribe(threadMode = ThreadMode.MainThread)
public void myEventBusObj(MyEvent myEvent) {
text.setText(myEvent.getStr());
Toast.makeText(this, myEvent.getStr(), Toast.LENGTH_SHORT).show();
}
//收到PersonActivity中的的person对象
@Subscribe(threadMode = ThreadMode.MainThread)
public void myEventBusPerson(PersonEvent event) {
text.setText(event.getPerson().getName()+event.getPerson().getAge());
Toast.makeText(this,event.getPerson().getName()+event.getPerson().getAge(), Toast.LENGTH_SHORT).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}
第一个ObjActivity,向MainActivity发送MyEvent对象
public class ObjActivity extends AppCompatActivity {
private Button btn_send;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_obj);
btn_send= (Button) findViewById(R.id.send_obj);
btn_send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
EventBus.getDefault().post(new MyEvent("222"));
}
});
}
}
PersonActivity向MainActivity发送PersonEvent,携带Psrson对象。
public class PersonActivity extends AppCompatActivity {
private Button btn_person;
private Person person;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_person);
btn_person= (Button) findViewById(R.id.send_person);
person=new Person();
person.setName("tom");
person.setAge("20");
btn_person.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
EventBus.getDefault().post(new PersonEvent(person));
}
});
}
}
默认为在发送线程执行,推荐使用,这样ThreadMode开销最少,避免线程切换。因此,简单的任务,已经完成时间短,不
需要要线程的
// Called in the same thread (default)
// ThreadMode is optional here
@Subscribe(threadMode = ThreadMode.POSTING)
public void onMessage(MessageEvent event) {
log(event.message);
}
使用些模式,在主线程中,可以刷新UI
// Called in Android UI's main thread
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessage(MessageEvent event) {
textField.setText(event.message);
}
// Called in the background thread
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onMessage(MessageEvent event){
saveToDisk(event.message);
}
事件处理在一个特殊的线程中处理,并且是一些耗时的操作,比如网络请求数据,数据库查询等。
// Called in a separate thread
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onMessage(MessageEvent event){
backend.send(event.message);
}
EventBus提升,EventBus3.0使用注解方式,我们都知道注解是基于反射,反射在运行时期获取,一般是普通创建java对象的2倍,但为什么效率会提升呢。
EventBus使用的是编译时期注解,注解分两种,一种是编译时期,另一个是运行时期。在而EventBus是在编译时期的注解,这种注解并不会基于反射动态创建,和Butterknife一样,它生成的代码于普通创建对象一样。