EventBus初体验

背景:

昨天看了启舰大神的关于EventBus的文章,很久以前的东西我居然没使用,今天学习一下。
这里写图片描述

何为EventBus(https://github.com/greenrobot/EventBus)

官方如是说:EventBus is a publish/subscribe event bus optimized for Android.EventBus是针对Android优化的发布/订阅事件总线。值得一提的是这家公司也出品了GreenDao这个库。

优点:

  1. 简化组件间的关联;
  2. 使你的代码简化;
  3. 快速;
  4. 体积小;
  5. 具有先进的特性,如交付线程、订阅者优先级等。

使用步骤:

测试场景:从第一个Activity(取名A)跳转到第二个Activity(取名B),然后从B回到A,需要携带一些数据到A(当然不用EventBus也有很多解决方案,这里只学习EventBus的优点和其它方案的缺点,开玩笑)。

代码实现先搭建这个情形,目前和EventBus还没有关系:

A的布局:

<TextView
    android:id="@+id/text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="跳转"/>

A的代码:

findViewById(R.id.text).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this, SecondActivity.class);
            startActivity(intent);
        }
    });

B的布局:

  <TextView
    android:id="@+id/text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="第二个界面"/>


<Button
    android:id="@+id/back"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:text="返回上一页"/>

B的代码:

findViewById(R.id.back).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            finish();
        }
    });

至此把场景搭建完了,此时和EventBus还没有半毛钱关系。

EventBus出场:

定义一个类,自己随意,我这里是EventMessage:
public class MessageEvent {
public final String message;

public MessageEvent(String message) {
    this.message = message;
}
}
在接收消息的Activity(A中)注册和解绑和处理收到的信息:
@Override
protected void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);//注册
}

@Override
protected void onStop() {
    super.onStop();
    EventBus.getDefault().unregister(this);//解绑
}

@Subscribe(threadMode = ThreadMode.MAIN)//4种模式;3.0之后添加注解并且可以随便给这个方法命名,貌似之前的版本不可以
public void onMessageEvent(MessageEvent messageEvent) {
    Toast.makeText(this, messageEvent.message, Toast.LENGTH_SHORT).show();//获取消息并显示
}
Activity(B中)发送消息:
findViewById(R.id.back).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            EventBus.getDefault().post(new MessageEvent("就是测试一下EventBus"));//发送的消息
            finish();
      }
 });

这里写图片描述

4种模型:

英文点这里
中文点这

踩过的坑:

  1. 接收消息的Activity在消息发送前必须已经注册过,所以你切不可在startActivity(intent)后发送消息,还没来得及注册(如果使用粘性事件另当别论)。
  2. 不可重复注册。

ps:如有错误,欢迎指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值