美文网首页
EventBus的使用

EventBus的使用

作者: 沐左 | 来源:发表于2018-05-02 16:22 被阅读0次

介绍

Android项目中的组件间通信,解耦、简洁、高效。

示意图

github地址:https://github.com/greenrobot/EventBus

官方文档:http://greenrobot.org/eventbus/documentation


使用

1、引入

compile 'org.greenrobot:eventbus:3.1.1'

2、定义一个消息实体

使用单例避免重复创建

public class MessageEntity {
    /**
     * 标识
     */
    public int mWhat;
    /**
     * 数据
     */
    public Object mMsg;

    private MessageEntity() {

    }

    private static class Holder {
        private static final MessageEntity INSTANCE = new MessageEntity();
    }

    public static MessageEntity obtainMessage() {
        return Holder.INSTANCE;
    }
}

3、定义一个常量类

用来标识消息类别msg.what

public final class MsgConstants {

    /**
     * 从SecActivity 传递数据到MainActivity
     */
    public static  int SHOW_INPUT_CONTENT = 1;
}

4、数据的传递

  • 订阅事件
 ////订阅事件
 EventBus.getDefault().register(this);

...
@Override
protected void onDestroy() {
    super.onDestroy();
    //取消//订阅事件
   EventBus.getDefault().unregister(this);
}

...
 //订阅事件的处理, 在ui线程执行 , 优先级100
@Subscribe(threadMode = ThreadMode.MAIN,priority = 100)
public void receiveMsg(MessageEntity msg) {
    if (msg.mWhat == MsgConstants.SHOW_INPUT_CONTENT) {
        String content = ((String) msg.mMsg);
        if (content != null && !content.isEmpty()) {
            mContentTv.setText("从SecActivity传递过来的数据是:" + content);
            Log.e(TAG, "从SecActivity传递过来的数据是:" + content);
       } else {
           Log.e(TAG, " content is null or empty ");
        }
   }
}

注意,优先级高的订阅者可以终止事件往下传递

 EventBus.getDefault().cancelEventDelivery(event) ;//优先级高的订阅者可以终止事件往下传递
  • 发布事件
 MessageEntity msg = MessageEntity.obtainMessage();
 msg.mWhat = MsgConstants.SHOW_INPUT_CONTENT;
 msg.mMsg = content;
 EventBus.getDefault().post(msg);

5、EventBus四种线程交互模式(四种 ThreadMode):

NAIN ---- UI主线程
指定接收方法在主线程中执行,可以放心的在里面执行更新UI操作。无论发布者是在主线程中还是在那一条子线程中发布消息,这边接收的都在主线程中

BACKGROUND ---- 子线程
无论发布者是在主线程或者是那一条子线程中发布消息,接收的肯定是在子线程中,并且是这样理解:如果是在主线程中发布消息,那么就会随机开辟一条子线程来接收消息。如果是在子线程中发布消息,那么就会在相同的子线程来接收消息。

POSTING ---- 和发布者处在同一个线程
在同一个线程中接收,也就是说,如果是在主线程中发布消息就只能在主线程中接收消息,如果是在子线程中,那么也只能在相同的子线程中去接收消息。

ASYNC ---- 异步线程
无论你在那个线程中发布消息都会在不同的线程中接受消息。如果你在主线程中发布消息,就会随机的开辟一条子线程来接收消息;如果是在子线程中发布消息,就会开辟一条不同的子线程来接收消息。


6、代码混淆

-keepattributes *Annotation*
-keepclassmembers class ** {
    @org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }

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

相关文章

网友评论

      本文标题:EventBus的使用

      本文链接:https://www.haomeiwen.com/subject/boxhlftx.html