二,EventBus在Activity中的使用

EventBus在Activity中的使用:

子线程发送消息到主线程更新UI

  • 注册
    在一个Activity创建的时候注册eventbus事件
    @Override
    public void initUI() {
        setContentView(R.layout.activity_event_bus);
        ButterKnife.bind(this);
        //订阅注册
        EventBus
                .getDefault()
                .register(this);
    }
  • 注销
    在Activity销毁的时候注销eventbus事件
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //订阅注销
        EventBus
                .getDefault()
                .unregister(this);
    }
  • 订阅者接收事件

    • 定义一个方法,传入String参数,在其中操作UI操作.

    • 添加注解@Subscribe,其含义为订阅者,在其内传入了线程模式,

    • 定义为ThreadMode.MainThread,其含义为该方法在UI线程完成.

    //订阅接收事件
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessageEvent(String event) {
        tvShow.setText(event);
    }
  • 发布者发送消息

    既然订阅了内容,当然就会发布消息。例如我们可以在子线程发送消息到主线程更新UI.
    你的接收信息为String类型,那么在post的时候,你post出去的也应该是String类型,其才会接收到消息.

    private void thread() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                //发送订阅的事件.
                EventBus
                        .getDefault()
                        .post("messag is from thread by eventbus... ...");
            }
        }).start();
    }
  • 发布者发送对象消息
    如果你post的是对象,首先你需要定义一个类作为事件载体
public class MessageEvent extends BaseEvent {

    public MessageEvent(String message) {
        super(message);
    }
}

然后你post的时候传第一个对象:

private void thread3() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                //发送订阅的事件.
                MessageEvent event
                        = new MessageEvent("MessageEvent obj is from thread3 by eventbus ...");
                EventBus
                        .getDefault()
                        .post(event);
            }
        })
                .start();
    }

当然,你接收的方法也需要修改接收的数据类型:

    //订阅接收事件对象
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void handleSomethingElse(MessageEvent event) {
        LogUtils.i("handleSomethingElse---->" + event.message);
        tvShow.setText(event.message);
    }

demo源码

你可能感兴趣的:(二,EventBus在Activity中的使用)