kotlin 编写一个简单的天气预报app(三)broadcast换成eventbus

news2024/9/24 3:26:17

使用eventbus替换broadcast

将从Broadcast切换到EventBus有以下几个好处:

  • 解耦性:通过使用EventBus,您可以实现组件之间的解耦。传统的Broadcast机制需要发送方和接收方明确知道对方的存在,并且需要在代码中设置Intent过滤器和广播接收器。而EventBus使用了发布-订阅模式,发送方和接收方之间没有直接的依赖关系,它们只需要通过事件进行通信。这样可以减少组件之间的耦合性,提高代码的可维护性和灵活性。

  • 简化代码:使用Broadcast机制,您需要创建Intent对象,设置action、category和extras等信息,并通过发送Broadcast的方式来传递数据。而使用EventBus,您只需要定义一个事件类,然后通过发送事件来传递数据。这样可以减少繁琐的Intent操作和广播发送的代码。

  • 灵活性:EventBus提供了更灵活的事件传递方式。您可以根据需要定义不同的事件类型,并只订阅您感兴趣的事件。而Broadcast机制则需要通过Intent过滤器来筛选接收的广播内容。EventBus还支持不同的线程模式,您可以在接收事件时指定在哪个线程上进行处理,以避免阻塞主线程。

  • 性能优化:相比Broadcast机制,EventBus可以更好地管理事件的传递。EventBus使用了事件订阅者的注册和注销机制,它能够在适当的时候自动注册和注销订阅者,避免了不必要的事件接收和处理。此外,EventBus还使用了事件线程的处理方式,可以更好地控制事件的处理顺序和并发性。

总的来说,使用EventBus可以提供更好的代码解耦性、简化代码、提高灵活性和性能优化等好处。但也要根据实际情况来决定是否需要使用EventBus来替代Broadcast机制。

1. 删除原来broadcast的代码

2. 添加EventBus依赖

首先,在您的项目中添加EventBus库的依赖项。您可以通过在项目的 build.gradle 文件中的 dependencies 部分添加以下代码来实现此操作:

    implementation 'org.greenrobot:eventbus:3.2.0'

3. 定义事件类

创建一个用于传递的事件类。这是一个普通的 Kotlin 类,可以包含需要传递的数据或其他信息。例如:

class WeatherResponseEvent(val weatherResponse: WeatherResponse)

4. 注册订阅者:

在希望接收事件的地方,您需要注册一个订阅者来接收事件。这可以是 Activity,Fragment,或是其他任何类。通常,在类的 onCreate 或 onStart 方法中执行注册操作。例如:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        EventBus.getDefault().register(this)
        findViewById<Button>(R.id.buttonSearch).setOnClickListener { searchCityNameWeather() }
    }

    override fun onDestroy() {
        super.onDestroy()
        EventBus.getDefault().unregister(this)
    }
    //...
}

5. 声明事件处理方法

在订阅者类中,您可以定义一个方法来处理事件。该方法必须用 @Subscribe 注解进行标记,并且必须是公共方法。例如:

class MainActivity : AppCompatActivity() {
	    @Subscribe(threadMode = ThreadMode.MAIN)
    fun onEvent(event: WeatherResponseEvent) {
        val weatherResponse = event.weatherResponse
        val kelvins = 273.15
        val cityName = weatherResponse.name
        val temperature = weatherResponse.main?.temp?.minus(kelvins)
        val maxTemperature = weatherResponse.main?.temp_max?.minus(kelvins)
        val minTemperature = weatherResponse.main?.temp_min?.minus(kelvins)
        val decimalFormat = DecimalFormat("#.#")
        val weatherStringArray = arrayListOf<String>()
        for(weather in weatherResponse.weather) {
            weatherStringArray += "main:${weather.main},description:${weather.description}"
        }

        @SuppressLint("SetTextI18n")
        findViewById<TextView>(R.id.weatherResult).text = "cityName:$cityName\n" +
                    "temperature:${decimalFormat.format(temperature)}\n" +
                "maxTemperature:${decimalFormat.format(maxTemperature)}\n" +
                "minTemperature:${decimalFormat.format(minTemperature)}\n" +
                "weather:$weatherStringArray"
    }
}

6. 发布事件

在发送事件的地方,您可以使用 EventBus.getDefault().post() 方法发布事件。例如:

object RetrofitClient {
//...
    private fun handleWeatherData(weatherData: WeatherResponse?) {
        if (weatherData != null) {
            val weatherResponseEvent = WeatherResponseEvent(weatherData)
            EventBus.getDefault().post(weatherResponseEvent)

            printWeatherData(weatherData)
        }
    }
//...

7.结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/817851.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c++ | 动态链接库 | 小结

//环境 linux c //生成动态链接库 //然后调用动态链接库中的函数//出现的问题以及解决//注意在win和在linux中调用动态链接库的函数是不一样的//在要生成链接库的cpp文件中比如以后要调用本文件中的某个函数&#xff0c;需要extern "c" 把你定的函数“再封装”避免重…

java实现日期拆分的方法

java实现日期拆分的方法 本文实例讲述了java实现日期拆分的方法。分享给大家供大家参考。具体如下&#xff1a; 如&#xff1a;计算6-1至6-5之间的日期天数及具体日期&#xff0c;预期的结果是得到&#xff1a; 6-1 6-2 6-3 6-4 6-5 以下是我利用java 日历类做的实现&am…

XtarBackup 8.0.33-28 prepare 速度提升 20 倍!

在这篇博文中&#xff0c;我们将描述 Percona XtraBackup 8.0.33-28 的改进&#xff0c;这显著减少了备份准备所需的时间&#xff0c;以便进行恢复操作。 Percona XtraBackup 中的这一改进显着缩短了新节点加入 Percona XtraDB 集群&#xff08;PXC&#xff09; 所需的时间。 …

多模光模块中Lens透镜的关键作用

随着现代通信技术的飞速发展&#xff0c;多模光模块已经成为光通信系统中不可或缺的关键组件。这些模块可实现高速、高容量的数据传输&#xff0c;广泛应用于数据中心、局域网和广域网等领域。在多模光模块中&#xff0c;透镜作为其中的重要组成部分&#xff0c;扮演着至关重要…

一些网络知识总结(自用)

一些网络知识总结&#xff08;自用&#xff09; 1. 进制的转换 所有进制转换成十进制就是把字面值*权数 比如16进制 5AEF 转成10机制话就是 1* 151614321064 * 5 2. ip地址网段的概念&#xff0c;可用ip&#xff0c;广播地址 比如一个ip为10.1.1.1/24那么他的网络号就是前…

C++继承特性(3)——类的默认成员函数

目录 前情回顾&#xff1a; 一.构造函数和析构函数&#xff1a; 情况1&#xff1a;子类没有写构造和析构函数时&#xff1a; 运行结果&#xff1a; 构造函数&#xff1a; 析构函数&#xff1a; 情况2&#xff1a;父类的构造函数并没有为成员变量初始化赋值&#xff0c;而…

论文阅读-BotPercent: Estimating Twitter Bot Populations from Groups to Crowds

目录 摘要 引言 方法 数据集 BotPercent架构 实验结果 活跃用户中的Bot数量 Bot Population among Comment Sections Bot Participation in Content Moderation Votes Bot Population in Different Countries’ Politics 论文链接&#xff1a;https://arxiv.org/pdf/23…

BES2700 SDK绝对时间获取方法

1 代码 2 实验 log 需要换算下

CLIP-GCD: Simple Language Guided Generalized Category Discovery(论文翻译)

CLIP-GCD: Simple Language Guided Generalized Category Discovery 摘要1 介绍2 相关工作2.1 NCD2.2 无监督聚类2.3 自监督和多模态预训练 3 方法3.1 GCD 问题设置3.2 我们的方法3.2.1 使用CLIP 在GCD 4 实验4.1 模型架构细节4.2 数据集和评估4.3 和最先进水平比较4.4 分析4.5…

echarts柱状图横坐标文字过长的解决办法

背景&#xff1a;echarts图中横坐标显示的文字过长&#xff0c;导致字都堆积在一块如下图所示 解决办法 一&#xff1a;可以尝试修改‘axisLabel’的‘rotate’和‘interval’参数&#xff0c;‘rotate’参数可以设置标签的旋转角度&#xff0c;可以避免标签之间的重叠&#x…

9.环境对象和回调函数

9.1环境对象 指的是函数内部特殊的变量this&#xff0c;它代表着当前函数运行时所处的环境 作用&#xff1a; 弄清楚this的指向&#xff0c;可以让我们代码更简洁 ➢函数的调用方式不同&#xff0c;this指代的对象也不同 ➢[谁调用&#xff0c;this 就指代谁] 是判断this指向的…

三十一章 uboot顶层Makefile详解

编译后的uboot源码文件 1、 arch 文件夹 这个文件夹里面存放着和架构有关的文件&#xff0c;进入后打开arm文件 2、 board 文件夹 board 文件夹就是和具体的板子有关的&#xff0c;打开此文件夹&#xff0c;里面全是不同的板子&#xff0c;毫无疑问正 点原子的开发板肯定也在…

如何使用Postman创建Mock Server?

这篇文章将教会大家如何利用 Postman&#xff0c;通过 Mock 的方式测试我们的 API。 什么是 Mock Mock 是一项特殊的测试技巧&#xff0c;可以在没有依赖项的情况下进行单元测试。通常情况下&#xff0c;Mock 与其他方法的主要区别就是&#xff0c;用于取代代码依赖项的模拟对…

python与深度学习(十二):CNN和猫狗大战二

目录 1. 说明2. 猫狗大战的CNN模型测试2.1 导入相关库2.2 加载模型2.3 设置保存图片的路径2.4 加载图片2.5 图片预处理2.6 对图片进行预测2.7 显示图片 3. 完整代码和显示结果4. 多张图片进行测试的完整代码以及结果 1. 说明 本篇文章是对上篇文章猫狗大战训练的模型进行测试。…

【构造】CF1758 D

Problem - D - Codeforces 题意&#xff1a; 思路&#xff1a; 如果需要构造一个和为定值的序列&#xff0c;那么考虑n-d,n-d1,.....nd-1,nd这种形式 如果要保证不能重复&#xff0c;那么先考虑一个排列&#xff0c;然后在排列上操作 如果根据小数据构造出了一些简单情形&a…

给初学嵌入式的菜鸟一点建议.学习嵌入式linux

学习嵌入式&#xff0c;我认为两个重点&#xff0c;cpu和操作系统&#xff0c;目前市场是比较流行arm&#xff0c;所以推荐大家学习arm。操作系统很多&#xff0c;我个人对开始学习的人&#xff0c;特别不是计算机专业的&#xff0c;推荐学习ucos。那是开源的&#xff0c;同时很…

CSDN 一周年创作纪念日(PS:vnjohn)

&#x1f52d; 嗨&#xff0c;您好 &#x1f44b; 我是 vnjohn&#xff0c;在互联网企业担任 Java 开发&#xff0c;CSDN 优质创作者 &#x1f4d6; 推荐专栏&#xff1a;Spring、MySQL、Nacos、Java&#xff0c;后续其他专栏会持续优化更新迭代 &#x1f332;文章所在专栏&…

【方法】PDF可以转换成Word文档吗?如何操作?

很多人喜欢在工作中使用PDF&#xff0c;因为PDF格式可以准确地保留文档的原始格式&#xff0c;比如字体、图像、布局和颜色等。 但如果编辑文档的话&#xff0c;PDF还是没有Word文档方便。那可以将PDF转换成Word格式&#xff0c;再来编辑吗&#xff1f;如何操作呢&#xff1f;…

HttpRunner自动化工具之实现参数化传递

参数化实现及重复执行 参数化测试&#xff1a;在接口测试中&#xff0c;为了实现不同组数据对同一个功能模块进行测试&#xff0c;需要准备多组测试数据对模块进行测试的过程。 在httprunner中可以通过如下方式实现参数化&#xff1a; 1、在YAML/JSON 中直接指定参数列表 2、…

用Apache Echarts展示数据

目录 1.后端代码 1.1 实体类&#xff1a; 1.2 SQL语句&#xff1a; 2.前端代码 2.1 安装 Apach Echarts安装包&#xff1a; 2.2 查找数据并赋值给Echarts 思路&#xff1a;后端查到数据&#xff0c;包装为map&#xff0c;map里有日期和每日就诊人数&#xff0c;返回给前端…