EventBus是一个类似观察者模式功能的开源库
EventBus的使用步骤
1.定义一个事件Event
2.定义一个观察者Subscriber,并将该观察者注册到EventBus中
3.EventBus将事件分发出去,并通知观察者该事件已经发生
4.响应该事件
5.使用完后EventBs反注册观察者
是通过EventBus的post()方法告知观察者事件发生。告知观察者事件发生的过程叫做事件的发布,观察者被告知事件发生叫做事件的接收,
是通过下面四个订阅函数实现的。
onEvent()
onEventMainThread()
onEventBackground()
onEventAsync()
四个方法的不同
onEvent():
如果使用onEvent()作为订阅函数,那么该事件在哪个线程中发布出来,onEvent()函数就在这个线程中运行,
也就是说发布事件的线程和接收事件的线程实在同一个线程.
注意:使用该方法时,在onEvent方法中不能执行耗时的操作,如果执行耗时的操作容易导致事件分发延迟.
onEventMainThread():
如果使用onEventMainThread作为订阅函数,那么不管事件是在哪个线程中发布,onEventMainThread方法都会在UI线程中执行,
接收事件就会在UI线程中执行,这个在Android中是非常常用的,因为在Android中只能在Ui线程中更新UI,所以onEventMainThread方法中是不能执行耗时操作的.
onEventBackground():
如果使用onEventBackground作为订阅函数,那么如果事件是从UI线程中发布出来的,onEventBackground就会在子线程中执行,
如果事件是从子线程中发布出来的,onEventBackground就会在该子线程中执行.
onEventAsync():使用onEventAsync作为订阅函数,那么不管事件是在哪个线程中发布,都会创建新的子线程执行onEventAsync.
EventBus的使用demo
定义一个类
package com.outdoors.jinghuang.demo;
/**
* Created by jing.huang on 2016/12/5.
*/
public class EventBusHimself {
/*要传递的数据*/
private String data;
public EventBusHimself(String data) {
this.data = data;
}
//在接收者需要获取到信息
public String getData() {
return data;
}
}
发布者
package com.outdoors.jinghuang.demo;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import de.greenrobot.event.EventBus;
/**
* Created by jing.huang on 2016/12/4.
*/
public class EventBusPublisher extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.event_bus_publisher);
findViewById(R.id.publish_event).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String data = "this is a practice of EventBus.";
//发布消息
EventBus.getDefault().post(new EventBusHimself(data));
}
});
}
}
监听者
package com.outdoors.jinghuang.demo;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import de.greenrobot.event.EventBus;
/**
* Created by jing.huang on 2016/12/4.
*/
public class EventBusReceiver extends Activity {
private TextView receiveResult;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//监听者注册EventBus
EventBus.getDefault().register(this);
setContentView(R.layout.event_bus_receiver);
receiveResult = (TextView) findViewById(R.id.receive_event_result);
findViewById(R.id.go_to_next).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(EventBusReceiver.this,EventBusPublisher.class);
startActivity(intent);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
//监听者反注册EventBus
EventBus.getDefault().unregister(this);
}
public void onEventMainThread(EventBusHimself eventBusHimself) {
if (eventBusHimself != null) {
String data = eventBusHimself.getData();
receiveResult.setText(data);
}
}
}
注意:这种方法需要先注册EventBus事件再发送EventBus事件。
订阅函数如onEventMainThread需要用public修饰,不能用private修饰,否则会报错。
订阅事件的参数需要是发布事件是的那个实例
EventBus还可以进行粘性事件,何为粘性事件呢?其实就是发布事件之后再订阅事件也能收到事件。
发布粘性事件的方法是postSticky()方法。注册粘性事件的方法registerSticky();
下面是粘性事件的demo
发布者
package com.outdoors.jinghuang.demo;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import de.greenrobot.event.EventBus;
/**
* Created by jing.huang on 2016/12/5.
*/
public class EventBusPublisher2 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.event_bus_publisher);
findViewById(R.id.publish_event).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
EventBus.getDefault().postSticky(new EventBusHimself("this is a practice of EventBus."));
Intent intent = new Intent(EventBusPublisher2.this, EventBusReceiver2.class);
startActivity(intent);
}
});
}
}
监听者
package com.outdoors.jinghuang.demo;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import de.greenrobot.event.EventBus;
/**
* Created by jing.huang on 2016/12/5.
*/
public class EventBusReceiver2 extends Activity {
private TextView resultData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.event_bus_receiver);
resultData = (TextView) findViewById(R.id.receive_event_result);
EventBus.getDefault().registerSticky(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
public void onEventMainThread(EventBusHimself eventBusHimself) {
if (eventBusHimself != null) {
String data = eventBusHimself.getData();
resultData.setText(data);
}
}
}
很容易可以发现第一个demo和第二个demo差不多,但是发布和接收EventBus事件的顺序完全相反,却能实现相同的目的。