EventBus使用详解(一)——初步使用EventBus

本文详细介绍EventBus框架在Android开发中的应用,包括其基本概念、工作原理及如何实现事件的发布与订阅。通过实例演示了如何定义事件类、注册与注销订阅者以及发布事件。

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

EventBus 是一个 Android 事件发布/订阅框架,通过解耦发布者和订阅者简化 Android 事件传递。传统的事件传递方式包括:Handler、BroadCastReceiver、Interface 回调,相比之下 EventBus 的优点是代码简洁,使用简单,并将事件发布和订阅充分解耦。



事件(Event):又可称为消息。其实就是一个对象,可以是网络请求返回的字符串,也可以是某个开关状态等等。事件类型(EventType)指事件所属的 Class。事件分为一般事件和 Sticky 事件,相对于一般事件,Sticky 事件不同之处在于,当事件发布后,再有订阅者开始订阅该类型事件,依然能收到该类型事件最近一个 Sticky 事件。


订阅者(Subscriber):订阅某种事件类型的对象。当有发布者发布这类事件后,EventBus 会执行订阅者的 onEvent 函数,这个函数叫事件响应函数。订阅者通过 register 接口订阅某个事件类型,unregister 接口退订。订阅者存在优先级,优先级高的订阅者可以取消事件继续向优先级低的订阅者分发,默认所有订阅者优先级都为 0。


发布者(Publisher):发布某事件的对象,通过 post 接口发布事件.

一、流程:



EventBus 负责存储订阅者、事件相关信息,订阅者和发布者都只和 EventBus 关联。

订阅者首先调用 EventBus 的 register 接口订阅某种类型的事件,当发布者通过 post 接口发布该类型的事件时,EventBus 执行调用者的事件响应函数。

二、EventBus 的简单介绍:

1.添加eventbus依赖
compile 'org.greenrobot:eventbus:3.0.0'
2、自定义一个类
public class FirstEvent {
    private String msg;
    public FirstEvent(String f_msg){
        msg=f_msg;
    }
    public String  getMsg(){
        return msg;
    }
}
public class SecondEvent {
    private String msg;
    public SecondEvent(String s_msg){
        msg=s_msg;
    }
    public String getMsg(){
        return  msg;
    }
}
3、实战
public class MainActivity extends AppCompatActivity {
    private Button btn;
    private TextView msg;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        EventBus.getDefault().register(this);//注册
        btn= (Button) this.findViewById(R.id.btn1);
        msg= (TextView) this.findViewById(R.id.txt1);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EventBus.getDefault().postSticky(new SecondEvent("Main1向Main2传递数据"));//类似于粘性广播,及
//Main2Activity在oncreate之后会接收来自MainActivity传递的数据。(当然可以用Intent来传递数据)
                Intent intent = new Intent(MainActivity.this,Main2Activity.class);
                startActivity(intent);
            }
        });


    }
    @Subscribe//接收来自MainActivity发送的数据
    public void onEventMainThread(FirstEvent event){
        String msg1 = "onEventMainThread收到了消息:" + event.getMsg();
        Log.d("harvic", msg1);
        msg.setText(msg1);
        Toast.makeText(this, msg1, Toast.LENGTH_LONG).show();
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);//反注册EventBus
    }
}
public class Main2Activity extends AppCompatActivity {


    private Button btn;
    private TextView msg;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        btn= (Button) this.findViewById(R.id.btn2);
        msg= (TextView) this.findViewById(R.id.txt2);


        EventBus.getDefault().register(this);//对于postSticky发送消息,在这里要在所有的空间都初始化之后再注册
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EventBus.getDefault().post(new FirstEvent("Main2向Main1传递数据"));//普通传递 
            }
        });


    }
    @Subscribe(sticky = true) //(方法可以随便命名)@Subscribe这个注解表示这个接收发送者的消息,具体接收那个根据方法参数的类型,例如在MainActivity里发送者的消息类型是Seconevent,这里就会执行方法的参数是SeconEventd的方法,如果发送者发型的消息类型是ThridEvnet,这里就会执行方法的参数是ThirdEvent的方法。其中这里有个(sticky=true),表明他是粘性event,这样才能对应MainActivity的postSticky。
public void onEventMainThread(SecondEvent event){
 String msg1 = "onEventMainThread收到了消息:" + event.getMsg();
        Log.d("harvic", msg1);
        msg.setText(msg1);
        Toast.makeText(this, msg1, Toast.LENGTH_LONG).show();
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);//反注册EventBus
    }
}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值