android天气实战

news2025/1/12 12:25:58

页面绘制

问题1、下拉框需要背景为透明

 我懒得写全部省份就写了5个所以不需要往下

图标准备

iconfont-阿里巴巴矢量图标库几坤年没来这了好怀念啊,图标库选择下雨的图标等

准备网络请求

0、API接口准备

api免费七日天气接口API 未来一周天气预报api (tianqiapi.com)

1、 添加网络请求权限

 2、网络请求工具类

package com.example.weather.Unil;
import android.util.Log;

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 Util {
    //ctrl+shift+u全部大写/小写
    public static final String URL_WEATHER_WITH="http://v1.yiketianqi.com/free/week?unescape=1&appid=00000000&appsecret=00000";

    public static String doGet(String urlStr){
        String result="";
        InputStreamReader inputStreamReader = null;
        //链接网路
        HttpURLConnection connection=null;
        BufferedReader bufferedReader=null;
        try {
            URL url = new URL(urlStr);
            connection =(HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setConnectTimeout(5000);
            //从连接中读取数据
            InputStream inputStream = connection.getInputStream();
            //二进制转换(数据流加工)
            inputStreamReader = new InputStreamReader(inputStream);
            bufferedReader = new BufferedReader(inputStreamReader);
            String line="";
            StringBuilder stringBu=new StringBuilder();
            while((line = bufferedReader.readLine())!=null){
                //读取一行拼接
                stringBu.append(line);
            }
            result=stringBu.toString();

        } catch (Exception e) {
            throw new RuntimeException(e);
        }finally {
            //关闭流们
            if (connection!=null)
                connection.disconnect();
            if (inputStreamReader!=null) {
                try {
                    inputStreamReader.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            if (bufferedReader!=null) {
                try {
                    bufferedReader.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
        return result;
    }
    public static String getWeatherOfCity(String city){
        //拼接天气url
        String weatherUrl=URL_WEATHER_WITH+"&city"+city;
        Log.d("gh", "-------------"+weatherUrl);
        String weatherResult = doGet(weatherUrl);
        Log.d("gh", "-------------"+weatherResult);
        return weatherResult;
    }
}

3、main中调用 

4、查看日志成功 

 数据解析并渲染(JSON)

package com.example.weather;

import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;

import androidx.activity.EdgeToEdge;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.AppCompatSpinner;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.recyclerview.widget.RecyclerView;

import com.example.weather.Unil.Util;
import com.example.weather.bean.DayWeather;
import com.example.weather.bean.WeatherBean;
import com.google.gson.Gson;

public class MainActivity extends AppCompatActivity {
    private AppCompatSpinner  mSpinner;
    private ArrayAdapter<String>  mspAdapter;
    private String[] mCities;
    private TextView tvWendu,tvxiangxi,tvkongqi,tvWindPos,tvWindSpeed;
    private ImageView imageView;
    private RecyclerView rlFutureWeather;

    private Handler myHandler=new Handler(Looper.myLooper()){
        @Override
        public void handleMessage(@NonNull Message msg) {
            //ctrl+o重写方法
            //传递给父
            super.handleMessage(msg);
            if (msg.what==0){
                String weather=(String) msg.obj;
                Gson gson = new Gson();
                //解析完成
                WeatherBean weatherBean = gson.fromJson(weather, WeatherBean.class);
                updateUiOfWeather(weatherBean);
               // Log.e("gh", "-----------------------"+weatherBean.toString());
            }

        }
    };

    private void updateUiOfWeather(WeatherBean weatherBean) {
        if (weatherBean==null)
            return;
        DayWeather toDayWeather = weatherBean.getData().get(0);
        if (toDayWeather==null)
            return;
        tvWendu.setText((Integer.parseInt(toDayWeather.getTemDay())+Integer.parseInt(toDayWeather.getTemNight()))/2+"");
        tvxiangxi.setText(toDayWeather.getWea()+' '+"最高"+toDayWeather.getTemDay()+"° "+"最低"+toDayWeather.getTemNight()+"°");
        tvkongqi.setText(Integer.parseInt(toDayWeather.getTemDay())+20+"");
        tvWindPos.setText(toDayWeather.getWin());
        tvWindSpeed.setText(toDayWeather.getWinSpeed());
        getImgResOfWeather(toDayWeather.getWeaImg());
    }

    private void getImgResOfWeather(String weaStr) {
//        固定9种类型(您也可以根据wea字段自己处理):
//        xue、lei、shachen、wu、yun、yu、yin、qing
        int result=0;
        switch (weaStr){
            case "qing":result=R.drawable.qingtian;break;
            case "yun":result=R.drawable.duoyun;break;
            case "shachen":result=R.drawable.shanchenbao;break;
            case "wu":result=R.drawable.wutian;break;
            case "xue":result=R.drawable.xuetian;break;
            case "yin":result=R.drawable.yintian;break;
            case "yu":result=R.drawable.yutian;break;
            case "lei":result=R.drawable.yutian;break;
        }
        imageView.setImageResource(result);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);
        initView();
    }
    //这里需要用下来关联自定义的布局怎么关联呢
    //需要Adapter
    private void initView(){
        mSpinner = findViewById(R.id.spinner);
        mCities=getResources().getStringArray(R.array.cities);//关联到下列边表
        mspAdapter = new ArrayAdapter<>(this, R.layout.spitem,mCities);//
        mSpinner.setAdapter(mspAdapter);
        mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                //选中城市后会开始获取天气
                String selectCity=mCities[position];
                getWeatherOfCity(selectCity);

            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });
        tvWendu=findViewById(R.id.wendu);
        tvkongqi=findViewById(R.id.kongqi);
        tvxiangxi=findViewById(R.id.juti);
        tvWindPos=findViewById(R.id.windpos);
        tvWindSpeed=findViewById(R.id.windSpeed);
        imageView=findViewById(R.id.imageView);
        rlFutureWeather=findViewById(R.id.scrollView2);
    }

    private void getWeatherOfCity(String selectCity) {
        //开启子线程请求与网络(必须再子线程)
        new Thread(new Runnable() {
            @Override
            public void run() {
                //请求网络
                String weatherResult = Util.getWeatherOfCity(selectCity);
               // Log.e("gh", "-----------------------"+selectCity);
                //使用handle将数据传递给主线程
                //从消息池获取消息效率更高
                Message msg= Message.obtain();
                msg.what=0;
                msg.obj=weatherResult;
                myHandler.sendMessage(msg);
            }
        }).start();
    }
}

效果 (审核中)

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

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

相关文章

SVM直观理解

https://tangshusen.me/2018/10/27/SVM/ https://www.bilibili.com/video/BV16T4y1y7qj/?spm_id_from333.337.search-card.all.click&vd_source8272bd48fee17396a4a1746c256ab0ae SVM是什么? 先来看看维基百科上对SVM的定义: 支持向量机&#xff08;英语&#xff1a;su…

[BLE] Heart Rate Protocol - Sensor

写在前面 目前我从网上找到的有关BLE心率协议的博文内容良莠不齐&#xff0c;很难让人根据文章内容来全面理解心率服务&#xff1b;此外SIG网站上有关心率服务的文档比较多&#xff0c;内容比较碎&#xff0c;需要读者从多个文档中将需要的内容拼接起来&#xff0c;因此写下这…

【动态规划】路径问题|不同路径I|不同路径II|珠宝的最高价值|下降路径的最小和|最小路径和|

一、不同路径I 62. 不同路径 - 力扣&#xff08;LeetCode&#xff09; &#x1f4a1;细节&#xff1a; 1.多开一行和一列&#xff08;跟一维数组多开一个位置一样&#xff09;&#xff0c;这样方便初始化 2.状态转移方程&#xff1a;注意走一步并不是多一种走的路径&#xff0…

在编程的世界里,我相信每一行代码都是一次对未来的投资

&#x1f600;前言 突然有感而发也是激励自己互勉 &#x1f3e0;个人主页&#xff1a;尘觉主页 文章目录 在编程的世界里&#xff0c;我相信每一行代码都是一次对未来的投资类似句子编程的本质代码的价值构建可持续的未来结语 在编程的世界里&#xff0c;我相信每一行代码都是一…

数据库基础--MySQL多表查询之外键约束

MySQL多表关系 一对一 顾名思义即一个对应一个的关系&#xff0c;例如身份证号对于每个人来说都是唯一的&#xff0c;即个人信息表与身份证号信息表是一对一的关系。车辆信息表与车牌信息表也是属于一对一的关系。 一对多 即一个表当中的一个字段信息&#xff0c;对应另一张…

【数据库原理及应用】期末复习汇总高校期末真题试卷02

试卷 一、填空题 数据库系统是指计算机系统中引入数据库后的系统&#xff0c;一般由数据库、________、应用系统、数据库管理员和用户构成。当数据库的存储结构发生了改变&#xff0c;由数据库管理员对________映象作相应改变&#xff0c;可以使________保持不变&#xff0c;…

vue快速入门(五十一)历史模式

注释很详细&#xff0c;直接上代码 上一篇 新增内容 历史模式配置方法 默认哈希模式&#xff0c;历史模式与哈希模式在表层的区别是是否有/#/ 其他差异暂不深究 源码 //导入所需模块 import Vue from "vue"; import VueRouter from "vue-router"; import m…

从零开始学AI绘画,万字Stable Diffusion终极教程(一)

【第1期】SD入门 2022年8月&#xff0c;一款叫Stable Diffusion的AI绘画软件开源发布&#xff0c;从此开启了AIGC在图像上的爆火发展时期 率先学会SD的人&#xff0c;已经挖掘出了越来越多AI绘画有趣的玩法 从开始的AI美女、线稿上色、真人漫改、头像壁纸 到后来的AI创意字、AI…

华为eNSP小型园区网络配置(上)

→跟着大佬学习的b站直通车← 目标1&#xff1a;dhcp分配ip地址 目标2&#xff1a;内网用户访问www.yzy.com sw1 # vlan batch 10 # interface Ethernet0/0/1port link-type accessport default vlan 10 # interface Ethernet0/0/2port link-type trunkport trunk allow-pass…

oracle pl/sql 如何让sql windows 显示行号

oracle pl/sql 如何让sql windows 显示行号 下载最新版的pl/sql第一步&#xff0c;在preferences中对sql Windows进行设置&#xff0c;如下所示第二步&#xff0c;在preferences中对User interface进行设置&#xff0c;如下所示结果如下当然&#xff0c;还可以通过右键选择是否…

iptables---防火墙

防火墙介绍 防火墙的作用可以理解为是一堵墙&#xff0c;是一个门&#xff0c;用于保护服务器安全的。 防火墙可以保护服务器的安全&#xff0c;还可以定义各种流量匹配的规则。 防火墙的作用 防火墙具有对服务器很好的保护作用&#xff0c;入侵者必须穿透防火墙的安全防护…

【大模型学习】私有大模型部署(基础知识)

私有大模型 优点 保护内部隐私 缺点 成本昂贵 难以共享 难以更新 大模型底座 基础知识点 知识库 知识库是什么&#xff1f; 知识库的作用是什么&#xff1f; 微调 增强大模型的推理能力 AI Agent 代理&#xff0c;与内部大模型进行交互 开源 and 闭源 是否可以查…

二叉树的实现(详解,数据结构)

目录 一&#xff0c;二叉树需要实现的功能 二&#xff0c;下面是各功能详解 0.思想&#xff1a; 1.创建二叉树结点&#xff1a; 2.通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树 3.二叉树销毁&#xff1a; 4.前序遍历&#xff1a; 5.中序遍历&#xff1a;…

QT5之布局操作

目录 实验之前的前提 局部布局和整体布局定义 快捷工具 水平和垂直布局 水平布局 在对象区域可以看出三个已经被水平布局在一起 在对象区域选中布局&#xff0c;点击工具取消当前布局 可以将两个小局部进行大局部布局 网格布局 弹簧布局 分割器布局 器件对齐边距 也…

Java Map集合(一)

1. Map接口 1.1 Map接口概述 Map接口是一种双列集合。Map的每个元素都包含一个键对象Key和一个值对象Value &#xff0c;键对象和值对象之间存在对应关系&#xff0c;这种关系称为映射&#xff08;Mapping&#xff09;。 Map接口中的元素&#xff0c;可以通过 key 找到 value&…

STD10A230XCB电源模块STD05A230XCB整流模块介绍

STD10A230XCB电源模块STD05A230XCB整流模块介绍&#xff0c;直流屏电源模块STD05A230XCB&#xff0c;整流模块STD10A115XCB&#xff0c;STD20A115XCB&#xff0c;STD10A230X&#xff0c;STD05A230X&#xff0c;直流屏充电模块的关键词: 电力智能高频开关充电模块STD20A230XCB,高…

这是一个简单的照明材料网站,后续还会更新

1、首页效果图 代码 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>爱德照明网站首页</title><style>/*外部样式*/charset "utf-8";*{margin: 0;padding: 0;box-sizing: border-box;}a{text-dec…

Golang Colly爬取图片gorm存储数据

语言:Golang 库:Iris/Colly/gorm 运行结果 text/html; charset=utf-8 It is image 20240429222029_0_0.jpg Saved file: images\20240429222029_0_0.jpg text/html; charset=utf-8 It is image 20240429222030_1_0.jpg Saved file: images\20240429222030_1_0.jpg It is ima…

遭遇“U盘只剩USBC乱码”危机?这里有你需要的解决方案!

当你满心期待地将U盘插入电脑&#xff0c;准备读取或传输文件时&#xff0c;突然发现U盘中的文件名全部变成了乱码&#xff0c;尤其是当这些乱码以“USBC”开头时&#xff0c;你可能会感到惊慌失措。这种情况不仅影响你的工作效率&#xff0c;还可能导致重要数据的丢失。那么&a…

一键解决!Microsoft VB/VC 微软常用运行库全版本整合包组件可选 v240329

01 软件介绍 众多程序的正常运行&#xff0c;依赖于微软的运行库。而运行库包括多种类型&#xff0c;如VB&#xff08;Visual Basic&#xff09;和VC&#xff08;Visual C&#xff09;&#xff0c;并且涵盖了不同的版本。鉴于此&#xff0c;整合版的运行库合集提供了一种高效的…