本文共 4236 字,大约阅读时间需要 14 分钟。
EventBus是Android下高效的发布/订阅事件总线机制。作用是可以代替传统的Intent,Handler,Broadcast或接口函数在Fragment,Activity,Service,线程之间传递数据,执行方法
1> 定义事件, 定义一个类,继承默认的Object即可,用于区分事件和传输数据,如:
public MsgEvent1(String msg)
public MsgEvent2(String msg)
2> 添加订阅者:EventBus.getDefault().register(this); 将所在类作为订阅者,框架会通过反射机制获取所有方法及其参数,有如下四种方法:
订阅者所在类可以定义以下一个或多个方法用以接收事件:
public void onEvent(param)
public void onEventMainThread(param)
public void onEventBackgroundThread(param)
public void onEventAsync(param)
public class RightFragment extends Fragment {
public void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
EventBus. getDefault().register( this);
public void onDestroy() {
EventBus. getDefault().unregister( this);
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_right , null);
tv = (TextView) view.findViewById(R.id. tv );
public void onEvent(MsgEvent1 msg) {
String content = msg.getMsg() + "\n ThreadName: " + Thread.currentThread ().getName() + "\n ThreadId: " + Thread.currentThread().getId();
System. out .println("onEvent(MsgEvent1 msg)收到" + content);
* 执行在主线程。 非常实用,可以在这里将子线程加载到的数据直接设置到界面中。
public void onEventMainThread(MsgEvent1 msg) {
String content = msg.getMsg() + "\n ThreadName: " + Thread.currentThread ().getName() + "\n ThreadId: " + Thread.currentThread().getId();
System. out .println("onEventMainThread(MsgEvent1 msg)收到" + content);
* 执行在子线程,如果发布者是子线程则直接执行,如果发布者不是子线程,则创建一个再执行 此处可能会有线程阻塞问题。
public void onEventBackgroundThread(MsgEvent1 msg) {
String content = msg.getMsg() + "\n ThreadName: " + Thread.currentThread ().getName() + "\n ThreadId: " + Thread.currentThread().getId();
System. out .println("onEventBackgroundThread(MsgEvent1 msg)收到" + content);
* 执行在在一个新的子线程 适用于多个线程任务处理, 内部有线程池管理。
public void onEventAsync(MsgEvent1 msg) {
String content = msg.getMsg() + "\n ThreadName: " + Thread.currentThread ().getName() + "\n ThreadId: " + Thread.currentThread().getId();
System. out .println("onEventAsync(MsgEvent1 msg)收到" + content);
public void onEvent(MsgEvent2 msg) {
String content = msg.getMsg() + "\n ThreadName: " + Thread.currentThread ().getName() + "\n ThreadId: " + Thread.currentThread().getId();
System. out .println("onEvent(MsgEvent2 msg)收到" + content);
注:发布者 post方法参数是Object类型,也就是可以发布任何事件。订阅者接受消息时,只要定义的是第二步四个方法任意一个,并且参数和发布者发布的一致,即可被执行。发布者也可以通过第二步接收消息,订阅者也可以作为发布者发消息给自己 public class LeftFragment extends ListFragment {
public void onViewCreated(View view, Bundle savedInstanceState) {
super .onViewCreated(view, savedInstanceState);
String[] strs = new String[] { "主线程消息1" , "子线程消息1" , "主线程消息2" };
setListAdapter( new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1 , strs));
public void onListItemClick(ListView l, View v, int position, long id) {
System. out .println("----------------------主线程发的消息1" + " threadName: " + Thread.currentThread().getName() + " threadId: " + Thread.currentThread().getId());
EventBus. getDefault().post( new MsgEvent1( "主线程发的消息1" ));
System. out .println("----------------------子线程发的消息1" + " threadName: " + Thread.currentThread().getName() + " threadId: " + Thread.currentThread().getId());
EventBus. getDefault().post( new MsgEvent1( "子线程发的消息1" ));
System. out .println("----------------------主线程发的消息2" + " threadName: " + Thread.currentThread().getName() + " threadId: " + Thread.currentThread().getId());
EventBus. getDefault().post( new MsgEvent2("主线程发的消息2" ));
转载地址:http://osgab.baihongyu.com/