Android-第三方框架EventBus

本文介绍EventBus,一种简化Android组件间通信的消息总线。它替代了Handler、Broadcast等传统方式,提供了更灵活的消息传递机制。文章详细展示了如何在Android项目中引入、配置并使用EventBus,包括发送和接收消息的具体代码示例。

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

简介

EventBus是一个消息总线,以观察者模式实现,用于简化程序的组件、线程通信,可以轻易切换线程、开辟线程。用于Activity,Fragment,Service,BroadCast等之间的通信。

EventBus 主要用来传递消息,可以代替Handle,callback,interface等。

使用

1 . 添加jar。

gradle中添加  compile 'org.greenrobot:eventbus:3.0.0'

2 . 应用

  • 在当前添加绑定和解除绑定。
@Override
 public void onCreate() {
     super.onCreate();
     //......
     EventBus.getDefault().register(this);//添加绑定
 }

@Override
public void onDestroy() {
    super.onDestroy();
    EventBus.getDefault().unregister(this);//解除绑定
    }   


  • 发送消息
    不管发布者是在主线程还是子线程,发布的消息在所有定义好的实体类型订阅者中都可以接收到消息。也就是,可以实现一个订阅者订阅多个事件,和一个事件对应多个订阅者。(参考别人的)
//发送一次
EventBus.getDefault().post(obj)

//发送多次
EventBus.getDefault().postSticky(obj);
  • 接收消息

    EventBus3.0有以下四种接收ThreadMode

    POSTING(默认):事件在哪个线程发布出来的,事件处理函数就会在这个线程中运行。
    MAIN: 主线程中运行,主要用来up UI。
    BACKGROUND:如果事件是在主程中发布,那么创建新的子线程中运行,如果事件是子线程中发布的,则在当前线程处理。在此事件处理函数中禁止进行UI更新操作。
    ASYNC:无论事件在哪个线程发布,该事件处理函数都会在新建的子线程中执行,同样,此事件处理函数中禁止进行UI更新操作。

    这里直接以传递Message对像为例

/**
     * 默认的线程模式,在当前线程下运行。如果当前线程是子线程则在子线          程中,当前线程是主线程,则在主线程中执行。
     * @param event
     */
 @Subscribe(threadMode = ThreadMode.POSTING)
 //发送多次
 /*@Subscribe(threadMode = ThreadMode.MAIN,sticky = true)*/
    public void onMessage(Message event) {
        //方法名自己定义,添加注解就好
        //......
    }

   /**
     * 在主线程中运行
     * @param event
     */
 @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessage(Message event) {
        //...... 更新ui
    }

/**
     * 在后台线程中执行,如果当前线程是子线程,则会在当前线程执行,如果当前线程是主线程,则会创建一个新的子线程来执行
     * @param event
     */
    @Subscribe(threadMode = ThreadMode.BACKGROUND)
    public void  onEventBackgroundThread(Message event){
        //......
    }


/**
     * 创建一个异步线程来执行
     * @param event
     */
    @Subscribe(threadMode = ThreadMode.ASYNC)
    public void onEventAsync(Message event){
         //......
    }

完整代码

实现:主界面点击,发送多次事件,实现打开Activity,并且在Activity中显示发送的Message内容。

主界面代码:

public class MainActivity extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        EventBus.getDefault().register(this);//添加绑定

        findViewById(R.id.tv_selfview).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //发送message为例,带有what和obj,这样以后可以通过what来区分类型
                EventBus.getDefault().postSticky(Message.obtain(null, 0x01, "Test"));
            }
        });
    }


    /**
     * 发送消息的接收时间,名称自定义,添加注解
     * 注解是通过反射的方式实现
     * @param event
     */
    @Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
    public void onMoonEvent(Message event) {
        startActivity(new Intent(getApplicationContext(), PostTestActivity.class));
    }

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

}

secondActivity代码实现

public class PostTestActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_post_test);
        EventBus.getDefault().register(this);//添加绑定

    }


    @Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
    public void onMessage(Message event) {
        ((TextView) findViewById(R.id.tv_showInfo)).setText(event.obj.toString());
    }


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

以上就是EventBus的简单应用,适合于发送替换广播,Handler,Service通信等。

### 推荐的 Android Studio 第三方库 在 Android 开发领域,有许多优秀的第三方库可以帮助开发者更高效地完成工作。以下是几个流行的、功能强大的开源库: #### 1. **Retrofit** Retrofit 是一个用于网络请求的强大工具,它通过简化 HTTP 请求流程使 API 调用更加便捷[^4]。支持同步和异步操作,并且可以轻松集成 OkHttp 和 Gson 来处理 JSON 数据。 ```gradle implementation 'com.squareup.retrofit2:retrofit:2.x.x' implementation 'com.squareup.retrofit2:converter-gson:2.x.x' ``` #### 2. **Glide/Coil** 这些图像加载库能够帮助优化图片资源管理并减少内存占用。 Glide 更加成熟稳定,而 Coil 则是一个基于 Kotlin 的现代替代方案。 ```gradle // For Glide implementation 'com.github.bumptech.glide:glide:4.x.x' // For Coil (Kotlin-based) implementation "io.coil-kt:coil:1.x.x" ``` #### 3. **Room Database** 由 Google 提供的数据持久化框架 Room 可以让 SQLite 数据库的操作变得更加简单直观。它的架构设计使得数据库迁移变得容易控制。 ```gradle implementation "androidx.room:room-runtime:2.x.x" kapt "androidx.room:room-compiler:2.x.x" ``` #### 4. **ButterKnife/Data Binding** 虽然 ButterKnife 已经逐渐被官方推荐的 Data Binding 所取代,但它依然是绑定视图的一种快速方法[^3]。Data Binding 提供了更强的功能性和灵活性。 ```gradle // If using ButterKnife implementation 'com.jakewharton:butterknife:10.x.x' annotationProcessor 'com.jakewharton:butterknife-compiler:10.x.x' // Or use DataBinding directly via build.gradle configuration. android { ... dataBinding { enabled = true } } ``` #### 5. **EventBus/GreenRobot EventBus** 事件总线模式允许组件之间解耦通信,在复杂应用中非常有用。GreenRobot 的 EventBus 实现轻量级却强大。 ```gradle implementation 'org.greenrobot:eventbus:3.x.x' ``` #### 6. **LeakCanary** 检测内存泄漏的有效工具 LeakCanary 对于提高应用程序稳定性至关重要。它可以自动监控对象引用链路从而定位潜在问题。 ```gradle debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.x.x' releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:2.x.x' ``` --- ### 如何选择合适的第三方库? 当考虑引入某个特定类型的第三方库时,请注意以下几点: - 库是否活跃更新?是否有良好的社区支持? - 是否存在文档详尽以及示例代码清晰易懂的情况? - 它与其他依赖项是否存在冲突风险? 以上提到的一些常用类库均满足上述条件,因此广泛应用于实际生产环境中[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值