Android 学习使用EventBus

官网镇楼
https://github.com/greenrobot/EventBus
http://greenrobot.org/eventbus/documentation/how-to-get-started/
在这里插入图片描述
参照官网三部曲使用

1 定义事件

定义事件,简单传入一个字符串

public class MessageEvent {

    public final String message;

    public MessageEvent(String message) {
        this.message = message;
    }
}}

2 初始化订阅者

官网示例:
首先注册与反注册,

@Override
public void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
}

@Override
public void onStop() {
    EventBus.getDefault().unregister(this);
    super.onStop();
}

然后处理事件,可以处理多个事件,根据事件类型来区分

// This method will be called when a MessageEvent is posted (in the UI thread for Toast)
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
    Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();
}

// This method will be called when a SomeOtherEvent is posted
@Subscribe
public void handleSomethingElse(SomeOtherEvent event) {
    doSomethingWith(event);
}

3 发送事件

在需要的地方发送事件

EventBus.getDefault().post(new MessageEvent("Hello everyone!"));

这样,基本使用就OK了。

写个Demo学习下

在 MainActivity 中写三个按钮,分别是 注册、打开应用、反注册。
在这里插入图片描述
MainActivity 代码示例

public class MainActivity extends AppCompatActivity {

    private Button register, start, unregister;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
    }

    private void initView() {
        register = findViewById(R.id.btn_register);
        unregister = findViewById(R.id.btn_unregister);
        start = findViewById(R.id.btn_start);
    }

    public void onRegister(View view) {
        EventBus.getDefault().register(MainActivity.this);
    }

    public void onStartActivity(View view) {
        startActivity(new Intent(MainActivity.this, EventActivity.class));
    }

    public void onUnregister(View view) {
        EventBus.getDefault().unregister(MainActivity.this);
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onGetMyEvent(MyEvent myEvent) {
        Log.d("luoah", "[MainActivity.java] -- onGetMyMessage -- myEvent:" + myEvent.getMessage());
    }
    
   @Subscribe(threadMode = ThreadMode.MAIN, priority = 1)
    public void onGetMyEventpriority(MyEvent myEvent) {
        Log.d("luoah", "[MainActivity.java] -- onGetMyEventpriority -- myEvent:" + myEvent.getMessage());
    }

    @Subscribe(sticky = true)
    public void onGetStickyMyEvent(MyEvent stickyMyEvent) {
        Log.d("luoah", "[MainActivity.java] -- onGetStickyMyEvent -- myEvent:" + stickyMyEvent.getMessage());
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onGetNewEvent(NewEvent newEvent) {
        Log.d("luoah", "[MainActivity.java] -- onGetNewEvent -- newEvent:" + newEvent.toString());
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onGetString(String string) {
        Log.d("luoah", "[MainActivity.java] -- onGetMyMessage -- string:" + string);
    }

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

EventActivity 中添加4个 Button 发送不同的事件
在这里插入图片描述
EventActivity 代码示例:

public class EventActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_myevent);
    }

    public void onPostMyEvent(View view){
        EventBus.getDefault().post(new MyEvent("I am MyEvent"));
    }
	
    public void onPostNewEvent(View view){
        EventBus.getDefault().post(new NewEvent((int) 100 , "I am NewEvent"));
    }

    public void onPostString(View view){
        String string = "I am String";
        EventBus.getDefault().post(string);
    }

    public void onPostStickyEvent(View view){
        EventBus.getDefault().postSticky(new MyEvent("I am sticky MyEvent"));
    }
}

MyEvent :

public class MyEvent {

    private String message;

    public MyEvent(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

NewEvent :

public class NewEvent {

    private int id;
    private String content;

    public NewEvent(int id, String content) {
        this.id = id;
        this.content = content;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    @Override
    public String toString() {
        return "id:" + id + "_content:" + content;
        //return super.toString();
    }
}

普通事件

如果 MainActivity 中没有注册,直接打开 EventActivity 执行 PostMyEvent 、PostNewEvent 、PostString ,MainActivity 是收不到事件的。
发送事件后再回到 MainActivity 注册,PostStickyEvent 收的到,其他的收不到。为什么?因为PostStickyEvent 可以接收粘性事件,后面说。
注册后打开 EventActivity ,
PostMyEvent ,log 如下

D/luoah: [MainActivity.java] -- onGetMyEventpriority -- myEvent:I am MyEvent
D/luoah: [MainActivity.java] -- onGetMyMessage -- myEvent:I am MyEvent
D/luoah: [MainActivity.java] -- onGetStickyMyEvent -- myEvent:I am MyEvent

分析:

@Subscribe(threadMode = ThreadMode.MAIN, priority = 1)

onGetMyEventpriority 使用注解说明在主进程接收事件,方便UI刷新。
指定了优先级为 1 ,未指定优先级默认是 0 ,这样,就优先于 onGetMyMessage 收到事件。
onGetStickyMyEvent 虽然指明了接收粘性事件,它依旧可以接收普通事件。
因为发送的事件内容是 MyEvent ,所以其他方法收不到事件,这样就区分开了事件类型。

PostNewEvent ,log 如下

D/luoah: [MainActivity.java] -- onGetNewEvent -- newEvent:id:100_content:I am NewEvent

PostString ,log 如下

D/luoah: [MainActivity.java] -- onGetMyMessage -- string:I am String

PostStickyEvent, log如下

D/luoah: [MainActivity.java] -- onGetMyEventpriority -- myEvent:I am sticky MyEvent
D/luoah: [MainActivity.java] -- onGetMyMessage -- myEvent:I am sticky MyEvent
D/luoah: [MainActivity.java] -- onGetStickyMyEvent -- myEvent:I am sticky MyEvent

粘性事件

前面说的未注册直接发送事件,订阅方是收不到事件的。
但粘性事件除外,粘性事件可以先发送,再注册,注册后是可以收到事件。
怎么接收粘性事件呢? 很简单,使用 @Subscribe(sticky = true) 就可以了

@Subscribe(sticky = true)
    public void onGetStickyMyEvent(MyEvent stickyMyEvent) {
        Log.d("luoah", "[MainActivity.java] -- onGetStickyMyEvent -- myEvent:" + stickyMyEvent.getMessage());
    }

先不注册,直接打开 EventActivity , PostStickyEvent ,
然后回到 MainActivity 并 注册, log 如下

D/luoah: [MainActivity.java] -- onGetStickyMyEvent -- myEvent:I am sticky MyEvent

粘性广播只能收到最近一次的事件,比如,修改 PostStickyEvent 为

EventBus.getDefault().postSticky(new MyEvent("I am sticky MyEvent 1"));
EventBus.getDefault().postSticky(new MyEvent("I am sticky MyEvent 2"));

然后进行操作 先不注册,直接打开 EventActivity , PostStickyEvent ,回到 MainActivity 并注册,log 如下

D/luoah: [MainActivity.java] -- onGetStickyMyEvent -- myEvent:I am sticky MyEvent 2
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值