首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >安卓天气预报app(一)——解析Json数据、数据类封装

安卓天气预报app(一)——解析Json数据、数据类封装

作者头像
roydonGuo
发布于 2022-11-02 07:40:22
发布于 2022-11-02 07:40:22
2.2K00
代码可运行
举报
文章被收录于专栏:postsposts
运行总次数:0
代码可运行

📌简易的安卓天气app(一)——解析Json数据、数据类封装简易的安卓天气app(二)——适配器、每小时数据展示简易的安卓天气app(三)——城市管理、数据库操作简易的安卓天气app(四)——搜索城市、完善页面

简述

不罗嗦那么多没用的;;; 既然是简易的天气app,那么本demo就没有那麽多复杂的交互,页面跳转,只包括了针对api获取和解析数据放到app主页面,由于配置定位服务太繁琐,本次测试没有使用定位功能。 项目只包含一个主要activity_main.xml,两个封装的实体用来存数据 用到的天气api可前往官网注册账号获取:天气api

例如我这里注册好了我的账号,进入主页面得到下图的appid和appsecret

然后把这两个东西复制粘贴到下面的api中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//里面的括号中的两个参数值换成你的,包括括号
https://tianqiapi.com/api?version=v1&appid=(你的appid)&appsecret=(你的appsecret)

==注意==: >

慎用此接口,每天有免费使用==上限==(如果你不想充钱) 地址栏搜索默认是当前所在城市,若是指定城市url后面加上&city=城市名,就行

接着,访问此url结果如图,一长串的json数据

如果你的浏览器支持转为json格式,那么会得到更清晰的数据格式,方便后续对其进行封装,也可百度在线json格式化工具,复制原始数据进去,得到格式化jsn数据

观察上图json数据,里面的嵌套关系决定了我们封装一个实体类肯定不能拿到全部信息,因为上图data,是一个json数组(JsonArray),里面包含了今天加上未来六天共七天的天气数据(JsonObject),所以data要单独封装成一个实体叫做DayWeatherBean,用来接受每天的数据。

项目结构

api请求工具包

那么既然是请求api解析数据,自然离不开HttpUrlConnection,如果学的不是HttpUrlConnection请自行根据更改。 首先封装一个工具包,表示根据指定地址网络请求得到数据,得到的是string字符串,实是json数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class NetworkUtil {
    // 一天测试次数有限,慎用
    public static final String URL_WEATHER = "https://tianqiapi.com/api?version=v1&appid=(你的appid)&appsecret=(你的appsecret)";

    public static String getWeather() {
        String result = "";
        HttpURLConnection connection = null;
        InputStreamReader inputStreamReader = null;
        BufferedReader bufferedReader = null;
        // 连接网络
        try {
            URL urL = new URL(URL_WEATHER);
            connection = (HttpURLConnection) urL.openConnection();
            connection.setRequestMethod("GET");
            connection.setConnectTimeout(5000);
            connection.setReadTimeout(5000);
            // 从连接中读取数据(二进制)
            InputStream inputStream = connection.getInputStream();
            inputStreamReader = new InputStreamReader(inputStream);
            // 二进制流送入缓冲区
            bufferedReader = new BufferedReader(inputStreamReader);
            // 容器
            StringBuilder stringBuilder = new StringBuilder();
            String line = "";
            while ((line = bufferedReader.readLine()) != null) {
                stringBuilder.append(line);
            }
            result = stringBuilder.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (connection != null) {
                connection.disconnect();
            }

            if (inputStreamReader != null) {
                try {
                    inputStreamReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
        return result;
    }

既然是网络请求,注意 >

AndroidManifest中别忘了加 <uses-permission android:name="android.permission.INTERNET" />

布局文件

接着就是布局,随意,怎么好看怎么来,无非就是接受几个数据传给TextView

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:alpha="0.8"
    android:background="@mipmap/bg"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    tools:context=".MainActivity">


    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="郑州"
        android:textSize="25sp"
        android:layout_gravity="center"
        android:gravity="center"
        android:textColor="@color/white"
        android:id="@+id/tv_city"/>

    <ImageView
        android:id="@+id/iv_weather"
        android:layout_width="125dp"
        android:layout_height="95dp"
        android:src="@drawable/weather_yin" />

    <TextView
        android:id="@+id/tv_weather"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="阴转多云"
        android:textColor="@color/white"
        android:textSize="20sp" />

    <TextView
        android:id="@+id/tv_week"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="星期二"
        android:textColor="@color/white"
        android:textSize="16sp" />

    <TextView
        android:id="@+id/tv_tem"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="31°C"
        android:textColor="@color/white"
        android:textSize="100sp" />


    <TextView
        android:id="@+id/tv_tem_low_high"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="25°C/33°C"
        android:textColor="@color/white"
        android:textSize="20sp" />
    <TextView
        android:id="@+id/tv_time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="更新时间:2022-06-15 08:22:23"
        android:textColor="@color/white"
        android:textSize="17sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:alpha="0.7"
        android:background="@drawable/blackground"
        android:orientation="horizontal"

        >

        <LinearLayout
            android:layout_width="120dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginLeft="5dp"
            android:gravity="center"
            android:orientation="vertical">

            <ImageView
                android:layout_width="105dp"
                android:layout_height="65dp"
                android:src="@drawable/fengli" />

            <TextView
                android:id="@+id/tv_win"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="南风3~4级"
                android:textColor="@color/white"
                android:textSize="16sp" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginRight="10dp"
            android:layout_marginLeft="10dp"

            android:orientation="horizontal">

            <TextView
                android:id="@+id/tv_air"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:gravity="center"
                android:text="空气:43 | 优\n空气好,适宜外出"
                android:textColor="@color/white"
                android:textSize="18sp" />
        </LinearLayout>

    </LinearLayout>

</LinearLayout>

效果图(上图有个阴转多云图,下方有源码,可自行了解,此次只拿数据传数据,不包括图片)

实体类

两个实体类

一个WeatherBean是最上层json封装,一个是DayWeatherBean封装的data(前面已经解答过)

WeatherBean

没什么好说的,就下面几个属性,学爬虫的应该更了解

其他的属性String就行,挑重要信息拿,data就是··List<DayWeatherBean>

此处命名不规范问题,由于使用的是Gson包封装,所以有一个实现类可用 public class WeatherBean implements Serializable 每个属性再加上序列化注解指定原始数据,就可解决,自行补充

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.util.List;

/**
 * TextView tv_city,tv_time,tv_weather,tv_week,tv_tem,tv_tem_low_high,tv_win,tv_air;7个
 * ImageView iv_weather;//天气图标
 */
public class WeatherBean {

    private String cityid;
    private String city;//城市名称
    private String update_time;//更新时间
    private List<DayWeatherBean> data;//获取今日天气,get[0]

    //toString(),get,set自行设置
}

DayWeatherBean

接着根据api中data中的属性名选择性封装DayWeatherBean

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.util.Arrays;

/**
 * TextView tv_city,tv_time,tv_weather,tv_week,tv_tem,tv_tem_low_high,tv_win,tv_air;7个
 * ImageView iv_weather;//天气图标
 */
public class DayWeatherBean {
    private String wea;//天气
    private String wea_img;//天气图标
    private String week;//周几
    private String tem;//温度
    //tv_tem_low_high=tem2+tem1拼接一起
    private String tem2;//低温
    private String tem1;//高温
    //tv_win=win+win_speed
    private String[] win;//风力
    private String win_speed;//风力等级
    //tv_air=air+air_level+air_tips拼接一起
    private String air;//
    private String air_level;//
    private String air_tips;//

    //toString(),get,set自行设置

MainActivity

使用handler来异步处理 首先开辟一个子线程,拿到网页数据传给handler

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private void getWeather() {
        // 开启子线程,请求网络
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 请求网络
                String weatherJson = NetworkUtil.getWeather();
                // 使用handler将数据传递给主线程
                Message message = Message.obtain();
                message.what = 0;
                message.obj = weatherJson;
                mHandler.sendMessage(message);
            }
        }).start();

    }

使用Gson序列化工具前别忘记添加依赖包 implementation 'com.google.code.gson:gson:2.8.5'

添加代码后别忘了构建一下,右上角点一下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private Handler mHandler = new Handler(Looper.myLooper()) {
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            if (msg.what == 0) {
                String weather = (String) msg.obj;
                Log.d("Main", ">>>>>>原始数据--weather---" + weather);
                if (TextUtils.isEmpty(weather)) {
                    Toast.makeText(MainActivity.this, "天气数据为空!", Toast.LENGTH_LONG).show();
                    return;
                }
                Gson gson = new Gson();//Gson序列化工具,JsonObject也行,方法不同
                WeatherBean weatherBean = gson.fromJson(weather, WeatherBean.class);
                if (weatherBean != null) {
                    Log.d("Main", ">>>>>>封装数据--weather---" + weatherBean.toString());
                }

                tvCity.setText(weatherBean.getCity());
                tvTime.setText(weatherBean.getUpdate_time());
                /**
                 * 当天天气
                 */
                dayWeather = weatherBean.getData().get(0);
                tvWeather.setText(dayWeather.getWea());
                tvTem.setText(dayWeather.getTem());
                tvTemLowHigh.setText(dayWeather.getTem2()+"/"+dayWeather.getTem1());
                tvWeek.setText(dayWeather.getWeek());
                tvWin.setText(dayWeather.getWin()[0]+dayWeather.getWin_speed());
                tvAir.setText("空气:"+dayWeather.getAir()+" | "+dayWeather.getAir_level()+"\n"+dayWeather.getAir_tips());
                ivWeather.setImageResource(WeatherImgUtil.getImgResOfWeather(dayWeather.getWea_img()));
               //此工具和图片源码中给出
            }
        }
    };

查看是否获取到数据

==源码自取==:gitee

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
DeepSeek X 运维:AI 赋能 IT 运维审批流变为 AI 工作流
直达原文:【DeepSeek谈运维】AI 驱动的 IT 运维管理变革:从审批流到AI工作流
嘉为蓝鲸
2025/04/14
3430
DeepSeek X 运维:AI 赋能 IT 运维审批流变为 AI 工作流
Zabbix告警分析新纪元:本地DeepSeek大模型实现智能化告警分析
作者介绍 :张世宏,2016-2024 Zabbix中国峰会演讲嘉宾,Zbxtable研发者,社区专家
Zabbix
2025/02/27
6921
Zabbix告警分析新纪元:本地DeepSeek大模型实现智能化告警分析
Zabbix告警分析新纪元:本地DeepSeek大模型实现智能化告警分析
随着企业数字化转型的深入,IT系统日益复杂化和规模扩大化,传统的运维模式已难以应对海量告警信息的处理需求。如何在第一时间准确识别问题根源并提供有效的解决方案,成为运维团队面临的重大挑战。Zabbix作为全球领先的开源监控解决方案,在帮助企业实现全面 IT 资产监控方面发挥着重要作用。而深度求索(DeepSeek)作为专注实现AGI的中国的人工智能公司,致力于为各行业提供先进的AI技术和服务。本文将介绍如何通过集成Zabbix与深度求索AI助手,构建智能化告警处理方案。
Zabbix
2025/02/27
6851
Zabbix告警分析新纪元:本地DeepSeek大模型实现智能化告警分析
zabbix监控-基本原理介绍
一、Linux下开源监控系统简单介绍 1)cacti:存储数据能力强,报警性能差 2)nagios:报警性能差,存储数据仅有简单的一段可以判断是否在合理范围内的数据长度,储存在内存中。比如,连续采样数据存储,有连续三次不在合理范围内的数据就报警 3)zabbix:结合上面两种工具的优点,又可以存储数据,又可以报警。 二、什么是Zabbix及其优缺点(对比Cacti和Nagios) Zabbix是一个基于Web界面提供分布式系统监视及网络监视功能的企业级开源解决方案。它能监视各种网络参数,保证服务器系统的安全
洗尽了浮华
2018/01/22
6.1K0
zabbix监控-基本原理介绍
AI 和 DevOps:实现高效软件交付的完美组合
AI 时代,DevOps 与 AI 共价结合。AI 由业务需求驱动,提高软件质量,而 DevOps 则从整体提升系统功能。DevOps 团队可以使用 AI 来进行测试、开发、监控、增强和系统发布。AI 能够有效地增强 DevOps 驱动流程,从开发人员的业务实用性和支持的角度来看,评估 AI 在 DevOps 中的重要性是十分必要的。
我是阳明
2023/08/21
9140
AI 和 DevOps:实现高效软件交付的完美组合
长文|基于Zabbix的可观测性监控
本文整理自王小东在2022Zabbix峰会演讲分享。ppt可在公众号后台回复“ppt"。
Zabbix
2023/07/03
7590
Zabbix告警分析新革命:DeepSeek四大创新场景助力智能运维
【导读】⾯对⽇益复杂的IT环境,如何⾼效分析监控数据并快速响应已成为运维工作中的关键挑战。本文深入探讨了DeepSeek与Zabbix结合的创新性应用,包括一键式智能告警分析、Zabbix文档知识库助手功能以及钉钉告警增强功能。通过详尽的部署指南和实用脚本,展示了DeepSeek如何助力提升故障排查效率,为运维工程师与系统管理员提供高效解决方案。
Zabbix
2025/03/11
9060
Zabbix告警分析新革命:DeepSeek四大创新场景助力智能运维
京东基于Zabbix告警治理优化实践长文回顾(含PPT)
许泽明,京东集团SRE。本文整理自许泽明在2021Zabbix深圳大会发表的演讲。
Zabbix
2021/09/08
1.3K0
Zabbix监控详解
Zabbix是什么 Zabbix 是由Alexei Vladishev创建,目前由Zabbix SIA在持续开发和支持。 Zabbix 是一个企业级的分布式开源监控方案。 Zabbix是一款能够监控各种网络参数以及服务器健康性和完整性的软件。Zabbix使用灵活的通知机制,允许用户为几乎任何事件配置基于邮件的告警。这样可以快速反馈服务器的问题。基于已存储的数据,Zabbix提供了出色的报告和数据可视化功能。这些功能使得Zabbix成为容量规划的理想方案。 Zabbix支持主动轮询和被动捕获。Zabbix所有
用户1173509
2018/03/28
5.2K0
Zabbix监控详解
Zabbix(1)-监控服务与zabbix介绍
对于传统意义的监控来说,监控系统属于安防系统中应用最多的系统之一,主要是用来监控异常和不好的事情发生,或者提供事件发生过程的记录和事后分析等功能。如视频监控系统就是典型的监控系统,视频监控系统就从早期的 CCTV 发展到 DVR到目前已经发展为基于 IP 网络的视频监控 IPVS。
mikelLam
2022/10/31
6920
Zabbix(1)-监控服务与zabbix介绍
通往自主可观测性的道路
用于系统监控和管理的自主可观测性旨在使用 GenAI 和机器学习来自动检测、诊断和解决问题。
云云众生s
2024/09/30
1420
zabbix基于docker安装
Zabbix 由 Alexei Vladishev 创建,目前由其成立的公司—— Zabbix SIA 积极的持续开发更新维护, 并为用户提供技术支持服务
summerking
2022/09/19
1.2K0
可观测性建设路线图
可观测性在任何现代软件开发和生产环境中都是至关重要的。它使团队能够更好地识别改进领域,使他们能够就开发流程做出明智的决策。遥测作为可观测性的关键部分,指的是数据收集的连续性。这些数据使组织能够描绘出整个系统健康的全貌,并在管理其应用程序时实现更高水平的可观测性和响应能力。
FunTester
2024/07/30
3200
可观测性建设路线图
监控解决方案:10个 Kubernetes 监控工具
Kubernetes (K8s) 是开发人员中最常用的容器编排平台。它自动化部署、扩展和管理容器的能力彻底改变了我们大规模构建和运行应用程序的方式。然而,随着 Kubernetes 变得越来越流行,为了提供高性能应用程序,对强大的监控解决方案的需求变得更加迫切。
DevOps云学堂
2023/08/22
3.5K0
监控解决方案:10个 Kubernetes 监控工具
Zabbix如何监控交通,慕尼黑运输集团案例分享
慕尼黑运输集团(MVG)是水、电、天然气、交通服务的综合提供商,该公司为成千上万的慕尼黑本地居民和游客提供日常保障服务:检测、排查、预防问题,和尽快高效的解决问题。
Zabbix
2021/02/03
6170
2022 年最佳 15 款监控工具!你不可错过
随着过去几十年企业网络的兴起,以及近年来随着虚拟、云和边缘网络的增加,监控工具已经显得越来越重要。在当今大多数企业中,监控混合 IT 环境中的网络流量对于主动网络管理至关重要。无论是检测行为异常、占用带宽、应对新威胁,还是使用历史数据绘制趋势图,监控工具在未来仍将是必不可少的。
民工哥
2022/10/27
1.6K0
2022 年最佳 15 款监控工具!你不可错过
案例|银行 Zabbix 监控架构分享
Zabbix 是一个基于 Web 界面提供分布式系统监视及网络监视功能的企业级开源解决方案。它能监视各种网络参数,保证服务器系统的安全运营,并提供灵活的通知机制以让系统管理员快速定位、解决存在的各种问题,借助Zabbix 可很轻松地减轻运维人员繁重的服务器管理任务,保证业务系统持续运行。其后端使用数据库存储监控配置和历史数据,可以非常方便地对接数据分析、报表定制等渠道,在前端开放了丰富的 RESTful API 供第三方平台调用,整体架构在当下的 DevOps 的趋势下显得非常亮眼。
Zabbix
2021/01/29
2.2K0
案例|银行 Zabbix 监控架构分享
2022 年最佳 15 款网络监控工具
随着过去几十年企业网络的兴起,以及近年来随着虚拟、云和边缘网络的增加,监控工具已经显得越来越重要。在当今大多数企业中,监控混合 IT 环境中的网络流量对于主动网络管理至关重要。无论是检测行为异常、占用带宽、应对新威胁,还是使用历史数据绘制趋势图,监控工具在未来仍将是必不可少的。
网络技术联盟站
2022/04/20
2.6K0
2022 年最佳 15 款网络监控工具
一文说清楚Zabbix能做什么?6.0将实现哪些功能?创始人演讲正文
本文整理自Zabbix创始人Alexei 在2021Zabbix中国峰会关于Zabbix6.0的演讲及3个精彩问答。
Zabbix
2022/02/10
7620
一文说清楚Zabbix能做什么?6.0将实现哪些功能?创始人演讲正文
Zabbix 5.0 LTS新功能一览
Zabbix 5.0正式发布其实在2020.05.12就发布了,它在可用性,安全性和完整性方面都有一系列重要改进!
后场技术
2020/09/03
1.1K0
Zabbix 5.0 LTS新功能一览
推荐阅读
相关推荐
DeepSeek X 运维:AI 赋能 IT 运维审批流变为 AI 工作流
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档