基于Android实现的天气预测APP

这篇具有很好参考价值的文章主要介绍了基于Android实现的天气预测APP。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基于Android开发的天气预测APP

一、相关技术

1.1 网络

网络数据源使用 Retrofit 库访问彩云 API 提供的 Webservice 接口来实现。

Retrofit 通过封装络请求和数据解析,极地提升了开发效率。并且持定义数据解析在封装所有网络请求的 API 时,我使用了协程技术来简化 Retrofit 回调的写法。

1.1.1 数据存储

本地数据源使用 SharedPreferences 持久化技术来实现,使用键值对的方式来存储数据。相较于数据库保存数据,SharedPreferences 操作更加简单,本地需要保存的数据也比较简单。因此 SharedPreferences 更加合适。

1.2 UI

创建 ViewModel 实现 ui 层与 service 层的解耦合

使用滚动控件 RecyclerView,使天气展示界面可以轻松高效地展示大量数据。我提供数据并定义每个列表项的外观,而 RecyclerView 库会根据需要动态创建元素

使用 Fragment,使我的一个单独的 activity 可以合成一个多区域的 UI,并且可以在多个 activity 中再使用。

1.3 全局获取 Context 对象

由于本项目需要在 Activity 以外的很多地方使用 Context 对象。因此我使用Application 类,在应用程序启动的时候,系统就会自动将其进行初始化,以便于我们管理程序内如全局 Context 一样的一些全局的状态信息。

基于Android实现的天气预测APP

这样就可以以静态变量的形式获取 Context 对象了。

同时项目中还需要在在 AndroidManifest.xml 文件的标签下进行指定自定义的 Application 类。

基于Android实现的天气预测APP

二、系统功能需求

2.1 需求分析

本项目实现了一个简单的天气信息查询的 APP。作为查询信息类的 APP 为了可以是用户能够及时准确的获取一个城市的天气信息。APP 至少应该具备准确查询城市级天气信息、可以查询多城市天气、可以刷新实时天气这三项基本功能。

由于获取城市天气信息的功能过于复杂,且与本课程学习重点无关。因此,我使用了彩云天气的开放 API 获取城市的天气。该 API 可以获取全球 100 多个国家的城市数据,以及每个城市的实时天气预报信息。经过简单的申请注册即可获取令牌使用。

2.2 功能描述

因此本项目具有:

  • 可以搜索全球大多数国家的各个城市数据;

  • 可以查看全球绝大多数城市的天气信息;

  • 可以自由地切换城市,查看其他城市的天气;

  • 可以手动刷新实时的天气。

  • 这四大主要功能,足以满足用户日常查询天气的需求。

三、系统设计与实现

3.1 总体设计

在本项目中,我使用了 MVVM 架构模式。MVVM 架构将程序结构主要分为 Model、View、ViewModel 三个模块。其中 Model 是数据模型部分;View 是界面展示部分;而 ViewModel 实现了业务逻辑和界面展示的解耦合。

基于Android实现的天气预测APP

  • MVVM项目架构示意图

  • UI 控制层包含了平时写的 Activity、Fragment、布局文件等与界面相关的展示代码。

  • ViewModel 层用于对 UI 元素相关的数据进行持久化,同时 ViewModel 层还提供了接口给 UI 控制层调用以及和 model 层进行通信。

  • Model 层用于判断调用方请求的数据应该是从本地数据源中获取还是从网络数据源中获取,并将获取到的数据返回给调用方。实现了 APP 所必须的逻辑处理功能。

3.2 系统组成

按照 MVVM 架构的设计,我在项目中将设计业务逻辑处理(model 层)的代码放在 service 包,并且将界面展示部分(view 层)代码放在 ui 包中。

3.3 模块设计

3.3.1 service 模块

在 logic 包下新建一个 Repository 单例类,作为仓库层的统一封装入口。使用liveData()将异步获取的数据以响应式编程的方式通知给上一层。同时我将liveData()函数的线程参数类型指定成了 Dispatchers.IO 使这段网络请求代码运行在子线程。

基于Android实现的天气预测APP

在 logic/model 包下新建一个 Sky.kt 文件,定义了一个 Sky 类作为数据模型表示该天气情况所对应的文字、图标和背景。然后使用 mapOf()函数来定义每种天气代码所应该对应的文字、图标和背景。

基于Android实现的天气预测APP

在 logic/model 通过 PlaceResponse.kt 文件定义数据模型实现对城市位置信息的映射。

在 logic/model 包下新建一个 RealtimeResponse.kt 文件定义数据模型实现对当前天气信息的映射。

在 logic/model 包下新建一个 DailyResponse.kt 文件定义数据模型实现对预测天气信息的映射。

在 logic/model 包下定义一个 Weather 类,将 Realtime 和 Daily 对象封装起来。

基于Android实现的天气预测APP

在 logic/network 包下新建一个 ServiceCreator 单例类,创建了一个 Retrofit 构建器。

在 logic/network 包下新建 PlaceService 接口,定义一个用于访问彩云天气城市搜索 API 的 Retrofit 接口。

基于Android实现的天气预测APP

该函数的返回值为 Call,这样 Retrofit 就会将服务器返回的 JSON 数据自动解析成 PlaceResponse 对象了。

在 logic/network 包下新建 WeatherService 接口定义一个用于访问天气信息 API 的 Retrofit 接口。

在 logic/network 包下新建一个 SunnyWeatherNetwork 单例类,定义一个统一的网络数据源访问入口,对所有网络请求的 API 进行封装。

基于Android实现的天气预测APP

并自定义的 await()函数调用 suspendCoroutine 函数简化回调过程。

基于Android实现的天气预测APP

在此当外部调用 SunnyWeatherNetwork 所提供的函数时,Retrofit 就会立即发起网络请求,同时当前的协程也会被阻塞住。直到服务器响应我们的请求之后,await()函数会将解析出来的数据模型对象取出并返回,同时恢复当前协程的执行,searchPlaces()函数在得到 await() 函数的返回值后会将该数据再返回到上一层。

在 logic/dao 包下新建一个 PlaceDao 单例类封装了几个必要的存储和读取数据的接口,将Place 对象存储到 SharedPreferences 文件中,并编写一些涉及 SharedPreferences 的操作。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rBl0cYvN-1662615514250)(https://www.writebug.com/myres/static/uploads/2022/9/8/339af5cac748f041bf0888002e73bfd3.writebug)]

3.3.2 ui 模块

实现搜索城市界面:

  • 在 ui/place 包下新建一个 PlaceViewModel,定义搜索城市界面的 ViewModel 层。

  • 在 ui/place 包下新建一个 PlaceAdapter 类为 RecyclerView 准备适配器。

  • 在 ui/place 包下新建一个 PlaceFragment 对 Fragment 进行实现。

实现天气展示界面:

  • 在 ui/weather 包下新建一个 WeatherViewModel,定义天气展示的 ViewModel 层。

  • 在 ui/weather 包下新建一个 WeatherActivity,显示天气信息的 Activity文章来源地址https://www.toymoban.com/news/detail-429257.html

到了这里,关于基于Android实现的天气预测APP的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于android校园新闻APP开发的设计与实现

    目 录 摘 要 I Abstract II 第一章 绪论 1 1.1 研究背景 1 1.2 研究意义 1 1.3研究现状 1 1.4设计思路及内容 2 第二章 系统开发环境及相关技术 3 2.1开发环境 3 2.2 Java SDK 3 2.3 Eclipse 3 2.4 ADT 3 2.5 Android SDK 4 2.6 JSP技术 7 2.7 JSON 8 2.8JDBC技术 8 第三章 系统分析 9 3.1 研究目标 9 3.2 需求分析 9 3

    2024年02月09日
    浏览(44)
  • 基于Android的天气预报系统的设计和实现

    目录 摘要 … 1 需求分析 … 2 一、开发背景… 2 二、项目需求分析… 2 总体设计 … 2 一、系统规划… 2 二、系统功能界面… 3 设置预报城市界面:… 3 2.天气显示界面: … 4 3.Widget 桌面小部件界面:… 5 三.设计目标… 6 系统设计 … 6 一、开发及运行环境… 6 二、数据库

    2024年02月08日
    浏览(62)
  • python基于机器学习的姓名预测性别网页app开发

    做这个项目的起因是之前csdn给我推荐了一个问答:基于机器学习的姓名预测性别的手机app开发。我点进去发现已经有人回答了,链接点进去一看,好家伙,这不是查表算概率吗,和机器学习有半毛钱关系。而且我觉得用姓名预测性别挺扯淡的,去查了一下,发现某知名爱国企

    2024年02月04日
    浏览(43)
  • Android——一个简单的天气APP

    EasyWeather演示效果视频 此天气数据源采用心知天气API(试用版),免费版获取数据有限,只能获取普通的温度、湿度等,例如压力、云量、可见度等均获取不到,试用版相当于正式版,可以获取大部分数据,试用日期是14天。 首页不同城市天气页面之间的滑动采用的是 ViewPager

    2023年04月26日
    浏览(43)
  • 挑战杯 基于LSTM的天气预测 - 时间序列预测

    🔥 优质竞赛项目系列,今天要分享的是 机器学习大数据分析项目 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/postgraduate ​ df = pd.read_csv(‘/home/kesci/input/jena1246/jena_climate_2009_2016.csv’) df.head() 如上所示,每1

    2024年02月21日
    浏览(52)
  • 计算机竞赛 题目:基于LSTM的预测算法 - 股票预测 天气预测 房价预测

    🔥 优质竞赛项目系列,今天要分享的是 基于LSTM的预测算法 - 股票预测 天气预测 房价预测 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/postgraduate 时间序列预测是一类比较困难的预测问题。 与常见的回归预测

    2024年02月07日
    浏览(49)
  • 计算机竞赛 基于LSTM的天气预测 - 时间序列预测

    🔥 优质竞赛项目系列,今天要分享的是 机器学习大数据分析项目 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/postgraduate ​ df = pd.read_csv(‘/home/kesci/input/jena1246/jena_climate_2009_2016.csv’) df.head() 如上所示,每1

    2024年02月11日
    浏览(50)
  • 毕业设计-基于 Python 的天气预测系统

    目录 前言 课题背景和意义 实现技术思路 一、Python 二、网络爬虫 三、基于 Python 的天气预测系统 四、系统测试 五、总结 实现效果图样例 最后     📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。

    2024年02月05日
    浏览(50)
  • Android 天气APP(十四)修复UI显示异常、优化业务代码逻辑、增加详情天气显示

    } public void setTmp_min(String tmp_min) { this.tmp_min = tmp_min; } public String getUv_index() { return uv_index; } public void setUv_index(String uv_index) { this.uv_index = uv_index; } public String getVis() { return vis; } public void setVis(String vis) { this.vis = vis; } public String getWind_deg() { return wind_deg; } public void setWind_deg(String w

    2024年04月25日
    浏览(35)
  • Android 天气APP(二十一)滑动改变UI(1)

    android:clickable=“true” android:padding=“@dimen/dp_12” androidx.core.widget.NestedScrollView android:layout_width=“match_parent” android:layout_height=“match_parent” android:background=“@drawable/shape_transparent_12” android:overScrollMode=“never” LinearLayout android:layout_width=“match_parent” android:layout_height=“match_pa

    2024年04月12日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包