EventBus

EventBus是由Greenrobot组织提供的Android轻量级事件总线,用于替代Intent、Handler、Broadcast或接口,实现Fragment、Activity、Service、Thread间的数据传递。本文介绍了EventBus的原理、优点,并与广播进行了对比,还提供了使用EventBus的步骤和示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

EventBus

什么是EventBus?

    由Greenrobot组织贡献的一个Android事件发布/订阅轻量级框架,EventBus可以代替Android传统的Intent,Handler,Broadcast或接口函数,在Fragment,Activity,Service,Thread之间传递数据.

EventBus的原理 :

  • EventBus底层采用的是注解和反射的方式来获取订阅方法信息(首先是注解获取,若注解获取不到,再用反射)
  • 当前订阅者是添加到Eventbus 总的事件订阅者的subscriptionByEventType集合中
  • 订阅者所有订阅的事件类型添加到typeBySubscriber 中,方便解注册时,移除事件

EventBus

EventBus的优点 :

  1. 实现了完全的解绑
  2. 在传值的时候,不需要真正的有对象接收
  3. 同一个事件可以被多个对象接收,只要他们的参数类型和发送方一致
  4. 有快又小,代码简洁,是一种发布订阅设计模式(观察者设计模式)

EventBus和广播对比 :

  1. EventBus使用起来和动态广播很像,需要注册-取消-注销
  2. EventBus要比广播占用资源少
  3. EventBus要比广播安全
  4. EventBus不能跨进程
  5. EventBus没有有序广播这样的功能
  6. EventBus可以方便的切换线程

如何使用EventBus ?

概念总是那么不好理解,所以我们用实际例子去诠释它
需求:

  • 有两个Activity,其中一个Activity包含一个Button,一个TextView,点击这个Button跳转到另一个Activity.
  • 另一个Activity中也有一个Button,点击Button进行事件的发送
  • 当第一个Activity接收到消息后显示吐司(将消息显示出来),并且将消息设置给TextView

step1. 导入EventBus依赖

dependencies {
        compile 'org.greenrobot:eventbus:3.0.0'
}

step2. 创建事件类

/**
 * If the code is not wrong its author is JokerCats.
 */

public class Event {

    private String msg;

    public Event(String msg){
        this.msg = msg;
    }

    public String getMsg() {
        return msg;
    }
}  

step3. 注册EventBus与注销EventBus

EventBus.getDefault().register(this);

EventBus.getDefault().unregister(this);

step4. 发送事件

EventBus.getDefault().post(new Event("Event received (づ ̄3 ̄)づ╭❤~"));  

step5. 接收事件

    @Subscribe
    public void setTextView(Event event) {
        String msg = event.getMsg();
        receiverTv.setText(msg);
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
    }  

Activity :

温馨提示:页面跳转,需要在Manifest文件中进行注册.

“`
public class OneActivity extends AppCompatActivity {

private Button mainBtn;
private TextView receiverTv;

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

    // 在要接收消息的页面注册EventBus ()中为接收数据的对象
    // 必须保证该对象至少有一个方法被@Subscribe所修饰
    EventBus.getDefault().register(this);

    mainBtn = (Button) findViewById(R.id.main_btn);
    receiverTv = (TextView) findViewById(R.id.main_tv);

    mainBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(OneActivity.this, TwoActivity.class);
            startActivity(intent);
        }
    });
}

// 接收EventBus的消息
// @Subscribe 不要忘记!
@Subscribe
public void setTextView(Event event) {
    String msg = event.getMsg();
    receiverTv.setText(msg);
    Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
}


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

}

```  
/**
 * If the code is not wrong its author is JokerCats.
 */

public class TwoActivity extends AppCompatActivity{

    private Button secondBtn;

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

        secondBtn = (Button) findViewById(R.id.second_btn);

        secondBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 发送事件 且发送过去的是我们创建的事件类的实例
                EventBus.getDefault().post(new Event("Event received (づ ̄3 ̄)づ╭❤~"));
            }
        });
    }
}  

Event :

public class Event {

    private String msg;

    public Event(String msg){
        this.msg = msg;
    }

    public String getMsg() {
        return msg;
    }
}  

效果图 :

EventBus2

感谢技术支持:http://blog.youkuaiyun.com/harvic880925/article/details/40660137

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值