iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android EventBus你需要了解的都在这
  • 906
分享到

Android EventBus你需要了解的都在这

eventbusAndroid 2022-06-06 14:06:42 906人浏览 泡泡鱼
摘要

Android EventBus你需要了解的都在这 什么是EventBus EventBus是一个Android事件发布/订阅的轻量级框架,基于

Android EventBus你需要了解的都在这 什么是EventBus

EventBus是一个Android事件发布/订阅的轻量级框架,基于观察者模式,将事件的接收者和发送者分离,主要是替代intent,Handler,BroadCast在Fragment,activity,service线程之间传递消息。作为GitHub上的人气开源项目,截止现在(2020-04-26)已经有22.4k个start。

EventBus-gitHub

集成
    implementation 'org.greenrobot:eventbus:3.1.1'
Event基本用法

Event的用法非常简介,一般我们使用分为五个步骤:

定义一个事件类
public class MessageEvent{
    ···
}
订阅事件
EventBus.getDefault().reGISter(this);
发送事件
EventBus.getDefault().post(new MessageEvent())
处理事件
    @Subscribe(threadMode = ThreadMode.MaiN)
    fun XXX(MessageEvent messageEvent){
        ···
    }

方法名可以随意取,但需要添加一个@Subscribe注解,注解中ThreadMode.MAIN是指定运行在主线程中的线程模型,这个后面细讲。

注销订阅事件
EventBus.getDefault().unregister(this);
EventBus应用举例
public class MainActivity extends AppCompatActivity {
//第一个界面
    private TextView tv_message;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        EventBus.getDefault().register(this);//注册
        tv_message = findViewById(R.id.tv_message);
        findViewById(R.id.bn_main).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(MainActivity.this,SecondActivity.class));
            }
        });
    }
    @Subscribe(threadMode = ThreadMode.MAIN)//需要加上注解
    public void  onEventMainThred(MyEvent event){
       tv_message.setText(event.getEvent())
   }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);//注销
    }
}
//第二个界面
public class SecondActivity extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.bn_main).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                MyEvent myEvent = new MyEvent();
                myEvent.setEvent("hello");
                EventBus.getDefault().post(myEvent);
                finish();
            }
        });
    }
}
//消息源
public class MyEvent {
    private String event;
    public String getEvent() {
        return event;
    }
    public void setEvent(String event) {
        this.event = event;
    }
}

在SecondActivity的按钮点击事件中,点击后回到MainActivity,并且MainActivity中的

TextView
的内容也变成了hello。

从这个例子中,可以看出:EventBus的功能类似于观察者模式和广播,但是比起重量级的广播,EventBus减少了复杂的调用和对象序列化的开销,并且解耦了发布者和订阅者之间的关系,在代码结构上也更加清晰简单。

EventBus的三要素 Event:事件,它可以是任意类型,EventBus会根据事件类型进行全局的通知。 Subscriber:事件订阅者,在EventBus 3.0之前我们必须定义以onEvent开头的那几个方法,分别是onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync,而在3.0之后事件处理的方法名可以随意取,不过需要加上注解@subscribe,并且指定线程模型,默认是POSTING。 Publisher:事件的发布者,可以在任意线程里发布事件。一般情况下,使用EventBus.getDefault()就可以得到一个EventBus对象,然后再调用post(Object)方法即可。 EventBus的四种线程模型

EventBus的线程模型就是我们在事件订阅时,在Subscriber注解中设置的变量,其中:

POSTING:默认,表示事件处理函数的线程跟发布事件的线程在同一个线程。 MAIN:表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。 BACKGROUND:表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。 ASYNC:表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作。 EventBus的粘性事件

EventBus除了可以发送普通事件,还可以支持发送粘性事件,就是先发送事件之后再订阅事件也能收到该事件,类似于粘性广播,示例代码如下:

1.订阅者处理粘性事件

    @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
    fun XXX(MessageEvent messageEvent){
        ···
    }

2.发送粘性事件

EventBus.getDefault().postSticky(new MessageEvent())

代码经过这样的处理,就可以先发送事件,在订阅事件

EventBus.getDefault().register(this);
时,进行事件处理。

EventBus的优先级

在Subscribe注解中总共有3个参数,上面我们用到了其中的两个,这里我们使用以下第三个参数,即

priority
。它用来指定订阅方法的优先级,是一个整数类型的值,默认是0,值越大表示优先级越大。在某个事件被发布出来的时候,优先级较高的订阅方法会首先接受到事件。

为了对优先级进行测试,这里我们需要对上面的代码进行一些修改。这里,我们使用一个布尔类型的变量来判断是否应该取消事件的分发。我们在一个较高优先级的方法中通过该布尔值进行判断,如果未true就停止该事件的继续分发,从而通过低优先级的订阅方法无法获取到事件来证明优先级较高的订阅方法率先获取到了事件。


作者:柴犬E


--结束END--

本文标题: Android EventBus你需要了解的都在这

本文链接: https://www.lsjlt.com/news/29654.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 你需要的Java分布式教程和学习笔记都在这里!
    Java分布式技术是当今软件开发领域中最热门和重要的技术之一。它可以让应用程序在多台计算机上运行,并且可以实现高可用性和可扩展性。如果你想学习Java分布式技术,那么你来对地方了!本篇文章将为你介绍Java分布式技术的基本概念,并提供一些学...
    99+
    2023-08-31
    教程 学习笔记 分布式
  • 探究Java接口打包的奥秘,你需要的准备都在这里!
    Java是一种面向对象的编程语言,它允许程序员使用接口来定义和实现功能。接口是一种抽象类,它定义了一个类应该具有的方法和属性,但不提供任何实现。Java接口的打包过程可能会让一些开发者感到困惑,本文将探究Java接口打包的奥秘,并为您提供一...
    99+
    2023-11-04
    接口 打包 面试
  • Python API、Shell、实时数据:你需要了解这些吗?
    在现代的软件开发中,Python API、Shell 和实时数据已经成为了必不可少的组成部分。它们不仅可以使开发过程更加高效,而且还可以为用户提供更好的体验。在本篇文章中,我们将深入探讨这三个主题,并演示一些代码示例。 Python AP...
    99+
    2023-07-31
    api shell 实时
  • 优化 | 重要的MySQL开发规范都在这了
    这篇文章主要介绍“优化 | 重要的MySQL开发规范都在这了”,在日常操作中,相信很多人在优化 | 重要的MySQL开发规范都在这了问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2024-04-02
  • 你真的需要了解Bash吗?
    Bash是一种强大的命令行解释器,它是Linux和macOS操作系统上的默认Shell。尽管它是如此重要,但很多人并不了解Bash的实际用途。在本文中,我们将探讨Bash的重要性以及它如何帮助我们更好地管理和控制计算机系统。 Bash是什么...
    99+
    2023-08-15
    path bash http
  • 你需要了解的 HTTP Status Code
    现在前后端分离的开发模式越来越流行,后端负责开发对应的 API,前端只需要关注前端页面的数据展示和前端逻辑即可。对于前后端分离这种开发模式,我个人还是比较喜欢的,因为这样可以让更专业的人做更专业的事情,后端专注于做 API 的开发设计,前端...
    99+
    2023-06-05
  • Python 学习笔记中的容器,你需要了解这些技术!
    Python 是一门非常强大的编程语言,它拥有很多容器类型,这些容器类型可以用来存储不同类型的数据,如数字、字符串、列表、元组、字典等。在 Python 中,容器类型是非常重要的,因为它们可以让我们更方便地组织和管理数据。在本篇文章中,我...
    99+
    2023-09-07
    学习笔记 容器 开发技术
  • 关于Maven的使用,这些你都真的了解么
    Maven使用说明及规范 此文档主要说明Maven的基础使用方式,以及在使用过程过程中需要遵守哪些默认的准则。 我们工作中会经常写maven的配置,但是很多maven使用细节你可能并...
    99+
    2024-04-02
  • 你需要了解的PHP编程算法
    PHP是一种流行的编程语言,具有广泛的应用和功能。在PHP编程中,算法是一个非常重要的部分,它能够帮助开发人员轻松地解决各种问题。在本文中,我们将介绍一些你需要了解的PHP编程算法。 一、排序算法 排序算法是计算机科学中的一个基本问题。在P...
    99+
    2023-08-27
    大数据 编程算法 文件
  • VuePress 知識寶庫:你需要的文件創作解答都在這裡
    .html: HTML 文件,可包含 Vue.js 組件。 .vue: Vue.js 組件文件,包含模板、腳本和樣式。 .js: JavaScript 文件,用於定義 Vue.js 組件的邏輯。 .css: CSS 文件,用於定義 Vu...
    99+
    2024-04-02
  • C站最全Python标准库总结,你想要的都在这里
    python标准库思维导图: 1、操作系统接口 os模块提供了不少与操作系统相关联的函数。 >>> import os >>> os.get...
    99+
    2024-04-02
  • 这些关于Go中interface{}的注意事项你都了解吗
    目录interface{} 注意断言用于反射的注意点我们一起来回顾一下上一次说到的 interface{} 可以用来做多态接口类型分为空接口类型和非空接口类型,他们的底层数...
    99+
    2023-03-08
    Go interface{}注意事项 Go interface{} Go interface
  • 一份完整的 PHP 容器函数学习笔记,你需要了解这些!
    在 PHP 中,容器函数是非常重要的一部分。容器函数可以帮助我们处理数据结构,比如数组、栈、队列等等。学习容器函数是 PHP 程序员必备的技能之一。在本文中,我们将为您介绍 PHP 中的常用容器函数。 数组 数组是 PHP 中最常用的...
    99+
    2023-09-13
    容器 函数 学习笔记
  • 你需要了解的ES6语法大总结
    目录前言let介绍不允许重复声明块级作用域为什么需要块级作用域?es6的块级作用域暂时性死区变量提升变量不会挂载到windowconst总结对于var的使用:对于let和const:...
    99+
    2024-04-02
  • 你需要了解的 Go 函数和 JavaScript 库
    随着技术的发展,越来越多的编程语言和库被开发出来。其中,Go 和 JavaScript 是两个非常流行的编程语言,并且它们都有许多常用的函数和库。本文将介绍一些,帮助你更好地理解这两个编程语言。 一、Go 函数 strings.Conta...
    99+
    2023-08-22
    npm 函数 javascript
  • Android Studio 控制台中文乱码,解决方案都在这里了,完美解决
    前言 Android Studio 如果不进行配置的话,运行程序时控制台中文乱码问题会非常严重,甚至影响我们对信息的获取和程序的跟踪。 通过历年的开发经验,在本文中我总结出四点用于解决控制台中文乱码问题的方法,希望有助于大家。 注意:下...
    99+
    2023-08-18
    android studio android UTF-8
  • PHP框架在Linux和Unix系统中的适用性:这里有一些你需要了解的信息!
    随着网络技术的不断发展和应用场景的不断扩展,PHP框架成为了很多Web开发人员的首选。不仅仅因为它的简单易用、快速开发等特点,更重要的是,PHP框架在Linux和Unix系统中的适用性非常好。在本篇文章中,我们将探讨PHP框架在Linux...
    99+
    2023-08-06
    框架 linux unix
  • 缓存是Django、Go和Bash都需要了解的东西吗?
    缓存是一个广泛应用于计算机系统中的技术,它通过将计算机系统中的数据存储在内存或其他高速存储设备中,以加快数据的访问速度。在Django、Go和Bash这些编程语言中,缓存也是一个非常重要的概念。本文将介绍缓存的基本概念以及在Django、...
    99+
    2023-10-26
    django bash 缓存
  • 你想在Linux上学习Java编程吗?这些关键字是你需要的!
    随着互联网的发展,Java编程语言已成为众多开发者的首选语言。而在Linux操作系统上学习Java编程,更是让人受益匪浅。在本文中,我们将为大家介绍如何在Linux上学习Java编程,以及需要掌握的关键字。 Java开发环境的安装 在...
    99+
    2023-09-23
    linux 关键字 linux
  • 你需要了解的最重要的ASP、HTTP、UNIX编程算法。
    ASP、HTTP、UNIX编程算法是现代编程中最重要的算法之一。这些算法被广泛应用于互联网应用程序的开发中。在本文中,我们将深入探讨这些算法,让您了解它们的工作原理和如何使用它们来开发高质量的应用程序。 一、ASP编程算法 ASP(Acti...
    99+
    2023-11-15
    http unix 编程算法
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作