事件分发库-EventBus

github

准备

下载jar包

eventbus-3.1.1.jar

混淆

http://greenrobot.org/eventbus/documentation/proguard/

#EventBus
-keepattributes *Annotation*
-keepclassmembers class * {
    @org.greenrobot.eventbus.Subscribe ;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }

# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
    (java.lang.Throwable);
}
#EventBus

使用

在接收消息的Activity或fragment中注册

//activity
 @Override 
 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        EventBus.getDefault().register(this);
    }
//fragment
 @Override 
 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EventBus.getDefault().register(this);
    }

 @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }

在两个Button点击事件中发送消息

//在主线程中发送消息
public void onClick(View v) {
                EventBus.getDefault().post(new MyEvent("this is a event"));
            }
//在子线程中发送消息
 public void onClick(View v) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        EventBus.getDefault().post(new MyEvent("this is a event2"));
                    }
                }).start();
            }

接收消息,打印使用的线程模式,接收消息的线程id,接收的消息内容

 @Subscribe(threadMode = ThreadMode.POSTING)
    public void onEventPOSTING(MyEvent event) {
        Log.e(TAG, "POSTING: " + Thread.currentThread().getId() + " " + event.getMsg());
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onEventMain(MyEvent event) {
        Log.e(TAG, "MAIN: " + Thread.currentThread().getId() + " " + event.getMsg());
    }

    @Subscribe(threadMode = ThreadMode.MAIN_ORDERED)
    public void onEventMAIN_ORDERED(MyEvent event) {
        Log.e(TAG, "MAIN_ORDERED: " + Thread.currentThread().getId() + " " + event.getMsg());
    }

    @Subscribe(threadMode = ThreadMode.ASYNC)
    public void onEventASYNC(MyEvent event) {
        Log.e(TAG, "ASYNC: " + Thread.currentThread().getId() + " " + event.getMsg());
    }

    @Subscribe(threadMode = ThreadMode.BACKGROUND)
    public void onEventBACKGROUND(MyEvent event) {
        Log.e(TAG, "BACKGROUND: " + Thread.currentThread().getId() + " " + event.getMsg());
    }

输出结果

在主线程中发送消息时:

test: ASYNC: 5987 this is a event
test: MAIN: 1 this is a event
test: POSTING: 1 this is a event
test: BACKGROUND: 5988 this is a event
test: MAIN_ORDERED: 1 this is a event

在子线程中发送消息时:

test: BACKGROUND: 5989 this is a event2
test: POSTING: 5989 this is a event2
test: ASYNC: 5990 this is a event2
test: MAIN_ORDERED: 1 this is a event2
test: MAIN: 1 this is a event2

总结:

接收代码所在线程和发送代码所在线程的关系

POSTING:和发送方保持一直
MAIN:不管发送方在哪里,始终在Main线程
ASYNC:不管发送方在哪里,始终开启新线程
BACKGROUND:如果发送方在主线程,BACKGROUND则会新开一个线程;如果发送方在子线程,BACKGROUND则会和发送方保持一致
MAIN_ORDERED:和MAIN一样,但事件会按先后顺序执行。

更新StickyEvent

如果Event发送过了,但是后面的Activity仍然想接收,由于后面的Activity的注册行为发生在事件发出之后,所以它是收不到事件的。解决方法就是使用postSticky。

//事件发出
EventBus.getDefault().postSticky(new MyEvent("this is a event"));

//事件接收
  @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
    public void testSicky(MyEvent event) {
        Log.e("test2", Thread.currentThread().getId() + "  " + event.getMsg());
    }

//事件移除
 public void removeEvent() {
        MyEvent stickyEvent = EventBus.getDefault().getStickyEvent(MyEvent.class);
        if (stickyEvent != null) {
            EventBus.getDefault().removeStickyEvent(stickyEvent);
        }
    }

你可能感兴趣的:(事件分发库-EventBus)