EventBus3.0的简单使用

本文介绍了EventBus 3.0的基本概念及其在Android开发中的应用。EventBus是一个轻量级的消息发布/订阅框架,用于简化Android应用内部各组件之间的通信。文章通过示例代码展示了如何注册、发送和接收事件,并解释了不同线程模式下的事件处理方式。

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

EventBus3.0的简单使用

1.介绍:

        EventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。简单的说,就是处理不同线程或者不同组件的数据通讯的问题。

盗用GiHub上EventBus的一张图。

eventbus

可以看到,发布者(Publisher)使用post()方法将Event发送到Event Bus,而后Event Bus自动将Event发送到多个订阅者(Subcriber)。这里需要注意两个地方:

(1)一个发布者可以对应多个订阅者。

(2)3.0以前订阅者的订阅方法为onEvent()onEventMainThread()onEventBackgroundThread()onEventAsync()。在Event Bus3.0之后统一采用注解@Subscribe的形式,具体实现方式见下文。


2.导入:

   androidStuio 在build.gradle添加依赖库  

 compile 'de.greenrobot:eventbus:3.0.0-beta1'


3.简单使用,直接上代码 

<span style="font-size:18px;"><span style="font-size:14px;">public class UserEventBus extends AppCompatActivity {

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

        //注册EventBus
        EventBus.getDefault().register(this);
        startActivity(new Intent(this,SecondActivity.class));  //跳转另一个Activity
    }


    @Subscribe(threadMode = ThreadMode.MainThread)
    public void eventBusMain(String str){
        Log.i("TAG","MAIN:"+str+"  Thread = "+Thread.currentThread().getId());
    }


    @Subscribe(threadMode = ThreadMode.BackgroundThread)
    public void eventBusBg(String str){
        Log.i("TAG", "BACKGROUND:"+str+" Thread="+Thread.currentThread().getId());
    }


    
    @Subscribe(threadMode = ThreadMode.PostThread)
    public void eventBusPosting(String str){
        Log.i("TAG", "POSTING:"+str+" Thread="+Thread.currentThread().getId());
    }

   
    @Subscribe(threadMode = ThreadMode.Async)
    public void eventBusAsync(String str){
        Log.i("TAG", "ASYNC:"+str+" Thread="+Thread.currentThread().getId());
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this); //销毁EventBus,一定记得销毁,不然数据会混乱
    }</span></span>

<span style="font-size:18px;"><span style="font-size:14px;">

public class SecondActivity extends AppCompatActivity {

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

        EventBus.getDefault().post("from second activity mainThread: info");
        Log.i("TAG", "Post thread="+Thread.currentThread().getId());

        new Thread(new Runnable() {
            @Override
            public void run() {
                EventBus.getDefault().post("from second activity childThread: info");
                Log.i("TAG", "Post thread="+Thread.currentThread().getId());
            }
        }).start();
    }
}
</span></span>


打印结果:

<span style="font-size:14px;">I/TAG: MAIN:from second activity mainThread: info  Thread = 1
I/TAG: ASYNC:from second activity mainThread: info Thread=16105
I/TAG: POSTING:from second activity mainThread: info Thread=1
I/TAG: Post thread=1
I/TAG: BACKGROUND:from second activity mainThread: info Thread=16106
I/TAG: BACKGROUND:from second activity childThread: info Thread=16107
I/TAG: ASYNC:from second activity childThread: info Thread=16105
I/TAG: POSTING:from second activity childThread: info Thread=16107
I/TAG: Post thread=16107</span>


备注:

1.threadMode  

 ThreadMode.MAIN,事件接收函数执行在UI线程;

ThreadMode.POST,事件在哪个线程发布,接收函数就执行在哪个线程;默认

ThreadMode.ASYNC,事件执行在一个独立的异步线程中。强制在后台执行

ThreadMode.BackgroundThread,如果事件是在UI线程中发布出来的,那么就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么直接在该子线程中执行。

如果由于事件的发布者是在子线程中,所以BACKGROUND与POSTING模式下订阅者与事件的发布者运行在同一个线程。

而ASYNC模式下又重新开起一个线程来执行任务。Main模式则是在主线程中运行

2.由于接受数据为Object的类型,所以大家可以传输任意一个对象,我这里为了方便就用String类型。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值