`
VIP庚
  • 浏览: 223307 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

组件之间通信------ EventBus 学习心得

 
阅读更多
Android 线程、组件之间通信可以通过Handler消息处理器,BroadCast广播,Service服务等。
  这儿介绍的EventBus是一款针对Android优化的发布/订阅的事件总线,可以替代上述的方法,进行线程之间传递消息.优点是开销小,代码更优雅。
  EventBus主要是基于观察者模式,特点:
  可以向不同的线程中发布事件,在ThreadMode 枚举中定义了4个线程,只需要在事件响应函数注解上加上ThreadMode ,则该事件响应函数就会在对应的线程中执行,ThreadMode定义的4个线程类型如下:
  1、PostThread:事件响应函数和事件发布在同一线程中执行。这个是默认值,这样可以避免线程切换。
  2、MainThread:事件响应函数会在Android应用的主线程(大部分情况下都是UI线程)中执行。
  3、事件响应函数会在一个后台线程中执行。如果事件发布函数不是在主线程中,则会立即在事件发布线程中执行响应函数。如果事件发布函数在主线程中,EventBus则会在唯一的一个后台线程中按照顺序来执行所有的后台事件响应函数。
  4、async:事件响应函数在另外一个异步线程中执行。该线程和发布线程、主线程相互独立。如果事件响应函数需要较长的时间来执行,则应该使用该模式,例如 网络访问等。需要注意的是,由于系统并行的限制,应该避免在同一时间触发大量的异步线程。 EventBus使用一个线程池来提高线程的效率。

demo地址:https://github.com/592713711/EventBusDemo
步骤
一 导入EventBus包 (包demo中)





二 将Activity注册成为事件订阅者(观察者)
Java代码  收藏代码
   @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
  
        //注册事件总线 让当前对象成为观察者  
        EventBus.getDefault().register(this);  
  
        initView();  
    }  
  
 @Override  
    protected void onDestroy() {  
        super.onDestroy();  
        //注销  
        EventBus.getDefault().unregister(this);  
    }  
 


三 在Activity中实现消息回调函数
Java代码 

   /** 
    * 观察对象数据改变  触发 
    * 不加 threadMode 默认在哪发的事件  就从哪个线程执行 ThreadMode.POSTING 
    * ThreadMode.MAIN:在创建方法中的线程中执行 
    * 
    * @param s 
    */  
   @Subscribe(threadMode = ThreadMode.MAIN)  
   public void showInfo(String s) {  
       Log.d(TAG, "MAIN   " + Thread.currentThread().getName() + "    " + s);  
   }  
  
   /** 
    * ThreadMode.POSTING:在发送线程中执行 
    * 
    * @param s 
    */  
   @Subscribe(threadMode = ThreadMode.POSTING)  
   public void showInfo2(String s) {  
       Log.d(TAG, "POSTING   " + Thread.currentThread().getName() + "    " + s);  
   }  
  
   /** 
    * ThreadMode.BACKGROUND:后台执行 
    * 若是主线程发布事件,会启动子线程执行该方法 
    * 若在子线程发布事件 就在当前子线程执行该方法 
    * 
    * @param s 
    */  
   @Subscribe(threadMode = ThreadMode.BACKGROUND)  
   public void showInfo3(String s) {  
       Log.d(TAG, "BACKGROUND   " + Thread.currentThread().getName() + "    " + s);  
   }  
  
   /** 
    * ThreadMode.ASYNC:在新线程中执行  不管在哪创建和发布  都会新启动一个执行 
    * 
    * @param s 
    */  
   @Subscribe(threadMode = ThreadMode.ASYNC)  
   public void showInfo4(String s) {  
       Log.d(TAG, "ASYNC   " + Thread.currentThread().getName() + "    " + s);  
   }  
 


注意:
1 回调函数必须要加上Subscribe,函数名无要求
2 回调函数的参数决定该接受的类型,上述的函数只能接受传递字符串的消息

四 在子线程中发布消息
Java代码
  
new Thread(  
               new Runnable() {  
                   @Override  
                   public void run() {  
                       Log.d(TAG, "发布    " + Thread.currentThread().getName());  
                       EventBus.getDefault().post("info");  
                   }  
               }  
       ).start();  


五 程序输出







可以看出在子线程中发布消息时:
用POSTING模式时方法是在该子线程中执行
用BACKGROUND模式时方法是在该子线程中执行
用MAIN模式时方法是在主线程中执行
用ASYNC模式时在线程池中单独取出一个线程,在其中执行方法

有兴趣的朋友可以试试在主线程中发布消息看看程序输出

补充:
1 由于post时传入的参数是Object,所以回调函数的参数如果要是int的话,必须改为Integer
2 用了EventBus一段时间后,发现并没有像handler中有延迟发送消息的方法,所以感觉EventBus并不能完全替代Handler
  • 大小: 3.9 KB
  • 大小: 1.6 KB
1
2
分享到:
评论

相关推荐

    Go-EventBus-Go轻量级事件总线兼容异步

    总结,Go-EventBus是Go语言中一个强大且易用的事件总线库,它的出现为开发者提供了更优雅的组件通信方式,尤其在需要构建松耦合、高并发的系统时,其价值更为显著。通过深入理解并熟练运用Go-EventBus,我们可以提升...

    netflix-eventbus-0.3.0.jar

    netflix-eventbus-0.3.0.jar

    eventbus-3.0.0.jar+eventbus-3.0.0-sources.jar

    而 "eventbus-3.0.0-sources.jar" 文件则提供了源代码,便于开发者查阅内部实现,学习如何使用和扩展库功能,或者进行调试。 在实际开发中,EventBus 的使用步骤通常包括以下几个部分: 1. **添加依赖**:在项目...

    eventbus-3.0.0 jar包及源代码下载

    eventbus-3.0.0 jar包及源代码下载;eventbus-3.0.0 jar包及源代码下载;eventbus-3.0.0 jar包及源代码下载;eventbus-3.0.0 jar包及源代码下载

    eventbus-2.1.0-beta-1.jar

    总的来说,EventBus-2.1.0-beta-1.jar 是一个强大的 Android 事件通信库,它通过简化组件间通信,提高了代码的可读性和可维护性。理解并熟练使用 EventBus,可以极大地提升 Android 应用的开发效率和质量。

    eventbus-3.1.1.jar

    "eventbus-3.1.1.jar" 文件是 EventBus 的一个特定版本,版本号为 3.1.1,通常包含该库的 Java 类和资源,用于集成到 Android 项目中。 在 EventBus 中,事件(Event)是通过发布(Posting)和订阅(Subscribing)...

    eventbus-3.0.0.jar

    总之,EventBus-3.0.0.jar 文件是 EventBus 的一个重要版本,它为 Android 开发者提供了高效、灵活的组件通信方式,使得应用程序的架构更加清晰,提高了代码的可读性和可维护性。通过引入和使用这个库,开发者可以...

    Vue组件通信eventbus封装-构造函数方式.zip

    这个压缩包文件"Vue组件通信eventbus封装-构造函数方式.zip"内包含了一个名为`EventBus2.js`的文件,很显然,它是对Vue事件总线的一种实现,使用了构造函数的方式。 首先,我们要理解什么是EventBus。EventBus是一...

    android eventbus-3.2.0.jar

    android eventbus-3.2.0.jar 解压就可以使用

    Vue组件通信eventbus封装-类方式.zip

    这种通信方式简单灵活,适用于一些简单的组件通信场景。然而,对于复杂的应用,推荐使用Vuex来集中管理状态,以保证数据的一致性和可预测性。在实际项目中,应根据项目规模和需求选择合适的通信方式。

    Android代码-EventBus-Apt

    compile 'com.shizhefei:eventbus-api:1.2.1' //eventbus 注解 compile 'com.shizhefei:eventbus-annotation:1.2.1' 在定义Event接口的Module添加,以便于生成Event接口的代理 annotationProcessor '...

    PyPI 官网下载 | domain-eventbus-0.1.10.tar.gz

    标题 "PyPI 官网下载 | domain-eventbus-0.1.10.tar.gz" 提供的信息表明,这是一个从Python Package Index(PyPI)官方源下载的软件包,名为 "domain-eventbus",版本为0.1.10,且打包格式为tar.gz。这个包可能是...

    EventBus-3.0.1.jar

    EventBus最新的jar包,2016-5-10

    eventBus-3.1.1.jar

    它由GreenRobot团队开发,旨在优化Android应用程序中的组件通信,减少类之间的硬编码依赖,提高代码的可测试性和可维护性。"eventBus-3.1.1.jar"是EventBus库的一个特定版本,包含所有必要的类和资源,便于开发者将...

    vertx-eventbus-client:node.js的vert.x eventbus客户端

    vertx-eventbus-client 这是用于node.js的vert.x 2.1 eventbus客户端库。 安装 npm install vertx-eventbus-client 原料药 var vertx = require ( 'vertx-eventbus-client' ) ; var eb = new vertx . EventBus ( ...

    安卓 EventBus 使用示例 eventbus-3.1.1.jar

    安卓 EventBus 使用示例,开发工具为eclipse+ADT,EventBus可简化安卓各个组件,线程之间的通信 相关博客 http://blog.csdn.net/qq_34763699/article/details/79467327

    EventBus-jar包

    这个库简化了应用程序组件之间的通信,避免了过度依赖于复杂的回调和跨层级的接口调用,使得代码更加模块化和易于维护。本文将深入探讨 EventBus 的核心概念、工作原理以及如何在实际项目中应用。 ### 核心概念 1....

    EventBus-master

    在 Android 开发中,EventBus 提供了一种替代传统 Intent、BroadcastReceiver 或者直接引用 Activity/Fragment 进行通信的方式,简化了代码结构,降低了组件之间的耦合度。 EventBus 的核心概念包括发布(Posting)...

    Weiz.EventBus-master.zip

    【事件总线】事件总线是一种设计模式,它允许软件组件之间通过发布和订阅事件来通信,而无需直接相互依赖。这种模式在微服务架构和复杂应用程序中特别有用,因为它降低了组件之间的耦合度,使得系统更易于扩展和维护...

Global site tag (gtag.js) - Google Analytics