当前位置: 首页 > news >正文

【JAVA】Java项目实战—移动端项目:天气查询APP

在移动互联网时代,天气查询应用程序(APP)是日常生活中不可或缺的一部分。无论是出门旅行、上班通勤,还是安排户外活动,获取实时天气信息都至关重要。Java作为一种强大且广泛使用的编程语言,特别适合用于开发跨平台的移动应用。通过学习如何使用Java开发天气查询APP,我们不仅可以掌握Java编程的基本技能,还能深入理解网络编程、API调用和数据处理等重要概念。

一、项目概述

本项目将实现一个简单的天气查询APP,具备以下功能:

  1. 实时天气查询

  2. 历史天气查询

  3. 用户界面展示

我们将使用Java编写后端逻辑,利用Android开发环境构建移动端界面,并通过调用天气API获取实时和历史天气数据。

二、理论知识

在开始具体的代码实现之前,我们需要了解一些Java的基本概念和相关技术。

1. Java基础知识
  • Java简介:Java是一种面向对象的编程语言,具有平台无关性、自动内存管理和强大的标准库等特性。它的“写一次,到处运行”的特性使得Java成为开发移动应用和Web应用的热门选择。

  • 面向对象编程(OOP):Java是一种面向对象的语言,支持封装、继承和多态等特性。通过OOP,我们可以将现实世界中的事物抽象为对象,从而提高代码的可重用性和可维护性。

    示例:假设我们要表示一个“天气”的对象,可以定义一个Weather类:

    public class Weather {private String city;private double temperature;private String condition;public Weather(String city, double temperature, String condition) {this.city = city;this.temperature = temperature;this.condition = condition;}public String getCity() {return city;}public double getTemperature() {return temperature;}public String getCondition() {return condition;}
    }
    
2. 网络编程
  • HTTP协议:在天气查询APP中,我们需要从天气API获取数据。HTTP(超文本传输协议)是Web上最常用的协议。我们将使用Java的HttpURLConnection类来发送请求和接收响应。

  • JSON数据格式:大多数天气API返回的数据格式为JSON(JavaScript Object Notation),它是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。

3. Android开发基础
  • Android Studio:Android Studio是官方的Android开发环境,提供了丰富的工具和功能,帮助开发者构建Android应用。

  • Activity和Fragment:在Android中,Activity是应用的单一界面,Fragment是可以嵌入到Activity中的UI组件。我们将创建一个主Activity来显示天气信息。

三、项目实现步骤

1. 创建Android项目

首先,在Android Studio中创建一个新的项目,选择“Empty Activity”模板,命名为WeatherApp

2. 添加网络权限

AndroidManifest.xml文件中添加网络权限,以便我们的应用能够访问互联网。

<uses-permission android:name="android.permission.INTERNET"/>
3. 设计用户界面

activity_main.xml中设计用户界面,添加EditText用于输入城市名,Button用于查询天气,TextView用于显示天气信息。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="16dp"><EditTextandroid:id="@+id/cityInput"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="输入城市名" /><Buttonandroid:id="@+id/queryButton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="查询天气" /><TextViewandroid:id="@+id/weatherOutput"android:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="18sp"android:paddingTop="16dp" />
</LinearLayout>
4. 实现天气查询功能

MainActivity.java中实现天气查询的逻辑。我们将使用AsyncTask类来执行网络请求,以避免在主线程中执行耗时操作。

import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import org.json.JSONObject;public class MainActivity extends AppCompatActivity {private EditText cityInput;private TextView weatherOutput;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);cityInput = findViewById(R.id.cityInput);weatherOutput = findViewById(R.id.weatherOutput);Button queryButton = findViewById(R.id.queryButton);queryButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String city = cityInput.getText().toString();new FetchWeatherTask().execute(city);}});}private class FetchWeatherTask extends AsyncTask<String, Void, String> {@Overrideprotected String doInBackground(String... params) {String city = params[0];String apiKey = "YOUR_API_KEY"; // 替换为你的API密钥String urlString = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "&appid=" + apiKey + "&units=metric";StringBuilder result = new StringBuilder();try {URL url = new URL(urlString);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("GET");BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));String line;while ((line = reader.readLine()) != null) {result.append(line);}reader.close();} catch (Exception e) {e.printStackTrace();}return result.toString();}@Overrideprotected void onPostExecute(String result) {try {JSONObject jsonObject = new JSONObject(result);String cityName = jsonObject.getString("name");double temperature = jsonObject.getJSONObject("main").getDouble("temp");String condition = jsonObject.getJSONArray("weather").getJSONObject(0).getString("description");String weatherInfo = "城市: " + cityName + "\n" +"温度: " + temperature + "°C\n" +"天气: " + condition;weatherOutput.setText(weatherInfo);} catch (Exception e) {weatherOutput.setText("获取天气信息失败");e.printStackTrace();}}}
}

代码解释

  1. UI组件:在onCreate方法中,我们初始化了输入框、按钮和输出框,并为按钮设置了点击事件。

  2. AsyncTaskFetchWeatherTask类继承自AsyncTask,用于执行网络请求。doInBackground方法中进行网络操作,onPostExecute方法中处理返回的JSON数据并更新UI。

  3. HTTP请求:使用HttpURLConnection类发送GET请求,获取天气数据。

  4. JSON解析:使用JSONObject类解析返回的JSON数据,提取城市名、温度和天气描述。

四、总结

通过本项目,我们学习了如何使用Java和Android开发一个简单的天气查询APP。我们掌握了网络编程、JSON解析和Android UI设计的基本知识。这个项目不仅展示了Java在移动开发中的应用,也为我们深入理解软件开发的各个环节奠定了基础。

在实际应用中,天气查询APP的开发可以拓展为更多功能,例如添加定位服务、推送天气预警等。这些功能的实现将进一步提升用户体验,也为我们提供了更多的学习机会。

相关文章:

【JAVA】Java项目实战—移动端项目:天气查询APP

在移动互联网时代&#xff0c;天气查询应用程序&#xff08;APP&#xff09;是日常生活中不可或缺的一部分。无论是出门旅行、上班通勤&#xff0c;还是安排户外活动&#xff0c;获取实时天气信息都至关重要。Java作为一种强大且广泛使用的编程语言&#xff0c;特别适合用于开发…...

SpringBoot - 动态端口切换黑魔法

文章目录 关键技术点核心原理Code 关键技术点 利用 Spring Boot 内嵌 Servlet 容器 和 动态端口切换 的方式实现平滑更新的方案&#xff0c;关键技术点如下&#xff1a; Servlet 容器重新绑定端口&#xff1a;Spring Boot 使用 ServletWebServerFactory 动态设置新端口。零停…...

Java爬虫技术:挖掘淘宝数据的利器

在当今大数据时代&#xff0c;网络爬虫技术已经成为获取网络数据的重要手段。Java作为一种强大且灵活的编程语言&#xff0c;非常适合开发复杂的网络爬虫系统。本文将详细介绍Java爬虫能够爬取的淘宝数据类型&#xff0c;并提供具体的代码示例&#xff0c;帮助您快速入门并掌握…...

Chromium for Android 浏览器的编译和安装

Chromium for Android 浏览器的编译和安装 Chromium for Android 浏览器的编译和安装环境要求和配置Chromium for Android源码下载安装 depot_tools获取代码转换现有的Linux检出安装额外的构建依赖运行钩子 Chromium for Android源码编译设置编译环境 编译 ChromiumChromium fo…...

实景视频与模型叠加融合?

[视频GIS系列]无人机视频与与实景模型进行实时融合_无人机视频融合-CSDN博客文章浏览阅读1.5k次&#xff0c;点赞28次&#xff0c;收藏14次。将无人机视频与实景模型进行实时融合是一个涉及多个技术领域的复杂过程&#xff0c;主要包括无人机视频采集、实景模型构建、视频与模型…...

Scala的隐式类

package hfd //隐式类 //任务&#xff1a;给之前的BaseUser添加新的功能&#xff0c;但是不要直接去改代码 //思路&#xff1a;把BaseUser通过隐式转换&#xff0c;改成一个新类型&#xff0c;而这个新类型中有这新的方法 //implicit class一个隐式转换函数类 //作用&#xff1…...

常见软件设计模式介绍:三层架构、MVC、SSM、EDD、DDD

三层架构&#xff08;View Service Dao&#xff09; 三层架构是指&#xff1a;视图层 view&#xff08;表现层&#xff09;&#xff0c;服务层 service&#xff08;业务逻辑层&#xff09;&#xff0c;持久层 Dao&#xff08;数据访问层&#xff09; 表现层&#xff1a;直接跟前…...

Springboot技术栈常见问题及搭建步骤

一. SpringBoot介绍 1.1. 引言 为了使用SSM框架去开发, 准备SSM框架的模板配置 为了使Spring整合第三方框架, 单独的去编写xml文件 导致SSM项目后期xml文件特别多, 维护xml文件的成本是很高的 SSM工程部署也是很麻烦, 依赖第三方的容器 SSM开发方式很是笨重 1.2 SpringBoot …...

session 共享服务器

1.安装 kryo-3.0.3.jar asm-5.2.jar objenesis-2.6.jar reflectasm-1.11.9.jar minlog-1.3.1.jar kryo-serializers-0.45.jar msm-kryo-serializer-2.3.2.jar memcached-session-manager-tc9-2.3.2.jar spymemcached-2.12.3.jar memcached-session-manager-2.3.2.jar …...

vue2:v-for实现的el-radio-group选中时显示角标,并自定义选中按钮的字体颜色和背景色

项目中需要实现一组预定义查询,每一个查询按钮在选中时右上角显示一个角标,展示当前查询返回的数据条目。 1、text-color="#3785FF" fill="#E6EAF1" 处理选中时的字体颜色和背景色,如上图,分别为蓝色和浅灰色。 2、badge中:value="selectedRadio…...

【Linux】-学习笔记10

第八章、Linux下的火墙管理及优化 1.什么是防火墙 从功能角度来讲 防火墙是位于内部网和外部网之间的屏障&#xff0c;它按照系统管理员预先定义好的规则来控制数据包的进出 从功能实现角度来讲 火墙是系统内核上的一个模块netfilter(数据包过滤机制) …...

鸿蒙NEXT开发案例:九宫格随机

【引言】 在鸿蒙NEXT开发中&#xff0c;九宫格抽奖是一个常见且有趣的应用场景。通过九宫格抽奖&#xff0c;用户可以随机获得不同奖品&#xff0c;增加互动性和趣味性。本文将介绍如何使用鸿蒙开发框架实现九宫格抽奖功能&#xff0c;并通过代码解析展示实现细节。 【环境准…...

深度解析:RTC电路上的32.768KHz时钟的频偏及测试

1、什么是RTC RTC是Real-Time Clock&#xff08;实时时钟&#xff09;的缩写&#xff0c;通常在电子产品中&#xff0c;是用时钟电路&#xff08;外部采用时钟芯片&#xff0c;比如AiP8563&#xff09;或时钟模块(SOC内部包含了时钟模块&#xff0c;只需要外接32.768KHz晶振)来…...

Scala的泛型

需求:定义一个名为getMiddleEle 的方法用它来获取当前的列表的中间位置的值中间位置的下标 长度/2目标:getMiddleEle(List(1,2,3,4,5)) > 5/2 2 > 下标为2的元素是:3 getMiddleEle(List(1,2,3,4)) > 4/2 2 > 下标为2的元素是:3格式如下: 定义一个函数的格式:def…...

OpenGL ES详解——glUniform1i方法是否能用于设置纹理单元

glUniform1i 方法确实可以用于设置纹理单元&#xff08;texture unit&#xff09;。在OpenGL中&#xff0c;纹理单元是图形硬件的一部分&#xff0c;它允许你同时绑定多个纹理&#xff0c;并在着色器程序中通过uniform变量来选择使用哪个纹理。 通常&#xff0c;纹理单元通过整…...

探索 Janus-1.3B:一个统一的 Any-to-Any 多模态理解与生成模型

随着多模态技术的不断发展&#xff0c;越来越多的模型被提出以解决跨文本与图像等多种数据类型的任务。Janus-1.3B 是由 DeepSeek 推出的一个革命性的模型&#xff0c;它通过解耦视觉编码并采用统一的 Transformer 架构&#xff0c;带来了一个高度灵活的 any-to-any 多模态框架…...

论文信息搜集

系列博客目录 文章目录 系列博客目录1.秩典型相关分析及其在视觉搜索重排序中的应用《Rank canonical correlation analysis and its application in visual search reranking》2.利用边信息的规范秩估计在多维谐波恢复中的应用《Canonical Rank Estimation Using Side Informa…...

实操给自助触摸一体机接入大模型语音交互

本文以CSK6 大模型开发板串口触摸屏为例&#xff0c;实操讲解触摸一体机怎样快速增加大模型语音交互功能&#xff0c;使用户能够通过语音在一体机上查询信息、获取智能回答及实现更多互动功能等。 在本文方案中通过CSK6大模型语音开发板采集用户语音&#xff0c;将语音数据传输…...

图表的放大和刷新功能

正常图表渲染显示&#xff1a; // 漏斗ading动画 let myChartone; // 获取配置项 let optionone; // 获取漏斗的数据 let order; let pay_order; let pay_order_num; let pay_order_num_num; let optiones; // 漏斗渲染 function polt(data) {// 从名为data的对象中获取ordata属…...

SQLServer利用QQ邮箱做SMTP服务器发邮件

环境 Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) SQL Server Management Studio 15.0.18384.0 SQL Server 管理对象 (SMO) 16.100.46367.54 Microsoft .NET Framework 4.0.30319.42000 操作系统 Windows Server2019 ———————————————— 前言&#xf…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...