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

news2024/9/28 9:25:30

使用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/804884.html

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

相关文章

Mnist分类与气温预测任务

目录 传统机器学习与深度学习的特征工程特征向量pytorch实现minist代码解析归一化损失函数计算图Mnist分类获取Mnist数据集&#xff0c;预处理&#xff0c;输出一张图像面向工具包编程使用TensorDataset和DataLoader来简化数据预处理计算验证集准确率 气温预测回归构建神经网络…

网页版五子棋项目演示

项目源码&#xff1a;五子棋游戏 演示使用的用户名&#xff1a;zyz 密码:123 注册页面&#xff1a; 登录页面&#xff1a; 游戏大厅页面&#xff1a; 未匹配&#xff1a; 匹配中&#xff1a; 游戏房间页面&#xff1a; 对方落子&#xff1a; 己方落子&#xff1a; 对…

5.6 Java递归讲解

5.6 Java递归讲解 A方法调用B方法&#xff0c;我们很容易理解递归就是&#xff1a;A方法调用A方法&#xff01;就是自己调用自己利用递归可以实现通过简单的程序来解决一些复杂的问题。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解&#xff0…

Redis的五大数据类型介绍

、简介 Redis的五大数据类型也称五大数据对象&#xff1b;前面介绍过6大数据结构&#xff0c;Redis并没有直接使用这些结构来实现键值对数据库&#xff0c;而是使用这些结构构建了一个对象系统redisObject&#xff1b;这个对象系统包含了五大数据对象&#xff0c;字符串对象&am…

MFC第二十四天 使用GDI对象画笔和画刷来开发控件(分页控件选择态的算法分析、使用CToolTipCtrl开发动静态提示)

文章目录 GDI对象画笔和画刷来开发控件梯形边框的按钮控件CMainDlg.hCMainDlg.cppCLadderCtrl.hCLadderCtrl.cpp 矩形边框的三态按钮控件 CToolTipCtrl开发动静态提示CMainDlg.hCMainDlg.cppCLadderCtrl.hCLadderCtrl.cpp: 实现文件 矩形边框的三态按钮控件 CToolTipCtrl开发动…

linux服务器安装redis

一、安装下载 下载安装参考文章 下载安装包地址&#xff1a;https://download.redis.io/releases/ 亲测有效&#xff0c;但是启动的步骤有一些问题 安装完成&#xff01;&#xff01;&#xff01; 二、启动 有三种启动方式 默认启动指定配置启动开机自启 说明&#xff1a…

CentOS下 Docker、Docker Compose 的安装教程

Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不会有任何接口。 Docker Compose是用于定义…

【Lua学习笔记】Lua进阶——Table(4)继承,封装,多态

文章目录 封装继承多态 封装 // 定义基类 Object {}//由于表的特性&#xff0c;该句就相当于定义基类变量 Object.id 1//该句相当于定义方法&#xff0c;Object可以视为定义的对象&#xff0c;Test可以视为方法名 //我们知道Object是一个表&#xff0c;但是抽象地看&#xff…

为什么要有虚拟内存?

操作系统是通过内存分段和内存分页的方式管理虚拟内存地址和物理内存地址之间的关系 内存分段 程序是由若干个逻辑分段组成的&#xff0c;代码分段、数据分段、栈段、堆段组成&#xff0c;不同的段有不同的属性&#xff0c;所以就用分段的形式分离开。 分段机制下的虚拟内存…

【业务功能篇58】Springboot + Spring Security 权限管理 【下篇】

4.2.2.3 SpringSecurity工作流程分析 SpringSecurity的原理其实就是一个过滤器链&#xff0c;内部包含了提供各种功能的过滤器。这里我们可以看看入门案例中的过滤器。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KjoRRost-1690534711077)(http…

使用Django自带的后台管理系统进行数据库管理的实例

Django自带的后台管理系统主要用来对数据库进行操作和管理。它是Django框架的一个强大功能&#xff0c;可以让你快速创建一个管理界面&#xff0c;用于管理你的应用程序的数据模型。 使用Django后台管理系统&#xff0c;你可以轻松地进行以下操作&#xff1a; 数据库管理&…

详解机器学习中的熵、条件熵、相对熵和交叉熵

这个是讲的不错的链接 https://www.cnblogs.com/kyrieng/p/8694705.html 这个是交叉熵 https://blog.csdn.net/m0_57236802/article/details/129554878

《焊接点云处理》-角焊焊缝处理

角焊缝点云处理 前言一、代码二、实现步骤3、验证前言 针对T型板,识别效果如下所示 一、代码 主函数 #include "CGALRECONSTRUCT.h" #include "CGALREGIONPLANE.h" #include

设计利器,掌握CAD辅助命令的必备指南

CAD设计中的辅助命令是提高效率和确度的关键工具。掌握并正确运用CAD中的各种辅助命令对于设计师们来说至关重要。本文将为你详细介绍如何使用CAD中的辅助命令&#xff0c;从而帮助你在设计过程中更加高效地实现你的创意。、 大家有没有发现&#xff0c;当我们的直线命令移动到…

Rethinking the Image Fusion(PMGI)

1.摘要 本文提出了一种基于梯度和强度比例维护&#xff08;PMGI&#xff09;的快速统一图像融合网络&#xff0c;可以端到端实现各种图像融合任务&#xff0c;包括红外和可见图像融合、多曝光图像融合、医学图像融合、多焦点图像融合和全色增强。我们将图像融合问题统一为源图…

C++信号量与共享内存实现进程间通信

关于信号量和共享内存的相关知识可参考下面链接&#xff1a; 进程间通信方式介绍_夜雨听萧瑟的博客-CSDN博客 C 创建共享内存_c共享内存_夜雨听萧瑟的博客-CSDN博客 信号量SytemV与Posix信号量的介绍与用法_夜雨听萧瑟的博客-CSDN博客 直接上代码&#xff0c;代码如下&#…

蓝桥杯单片机第十二届国赛 真题+代码

iic.c /* # I2C代码片段说明1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。2. 参赛选手可以自行编写相关代码或以该代码为基础&#xff0c;根据所选单片机类型、运行速度和试题中对单片机时钟频率的要求&#xff0c;进行代码调试和修改。 */ #include <STC1…

golang文件锁,目录锁,syscall包的使用

先说结论 1. golang提供了syscall包来实现文件/目录的加锁&#xff0c;解锁 2. syscall包属于文件锁&#xff0c;是比较底层的技术&#xff0c;并不能在所有操作系统上完全实现&#xff0c;linux上实现了&#xff0c;windows下面就没有 3. 加锁时调用syscall.Flock(fd&#…

安全学习DAY09_加密逆向,特征识别

算法逆向&加密算法分类&#xff0c;特征识别 文章目录 算法逆向&加密算法分类&#xff0c;特征识别算法概念&#xff0c;分类单向散列加密 - MD5对称加密 - AES非对称加密 - RSA 常见加密算法识别特征&#xff0c;解密特点MD5密文特点BASE64编码特点AES、DES特点RSA密文…