android天气实战

页面绘制

问题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();
    }
}

效果 (审核中)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智慧能源数据监控平台

随着科技的飞速发展&#xff0c;能源管理已逐渐从传统的粗放型向精细化、智能化转变。在这个转型过程中&#xff0c;HiWoo Cloud平台的智慧能源数据监控平台以其独特的技术优势和创新理念&#xff0c;正引领着能源管理的新潮流。 一、智慧能源数据监控平台的概念 智慧能源数据…

Vue 工程化开发入门

Vue开发的两种方式&#xff1a; 核心包传统开发模式&#xff1a;基于html/css/js文件&#xff0c;直接引入核心包&#xff0c;开发Vue工程化开发模式&#xff1a;基于构建工具的环境中开发Vue 这里选择Vue cli脚手架 进行开发&#xff0c;搜索教程自行下载。 组件化开发 一个页…

【R语言】描述性数据分析与数据可视化

我们处理的变量可以分为两类&#xff0c;一类是连续型变量&#xff0c;另一类叫做分类型变量&#xff0c;其中对于连续型变量&#xff0c;如果服从正态分布就用平均值填充NA&#xff0c;不服从正态分布就用中位数填充NA&#xff0c;对于分类型变量&#xff0c;不管是有序的&…

蓝桥杯单片机省赛——第八届“基于单片机的电子钟程序设计与调试”程序部分

往期回顾 第三届蓝桥杯单片机省赛 第四届蓝桥杯单片机省赛 第五届蓝桥杯单片机省赛 第六届蓝桥杯单片机省赛 第七届蓝桥杯单片机省赛 文章目录 往期回顾一、前期准备二、代码详情1.基础代码蜂鸣器/继电器/led/定时器之类的代码 2.按键详解按键写法讲解 3.驱动的处理驱动写法讲…

Linux学习笔记:进程间的通信.共享内存shm

共享内存shm 什么是共享内存shm共享内存的特点关键函数ftokshmgetshmatshmdtshmctl 代码示例 什么是共享内存shm 进程间通信的前提:必须让不同的进程看到同一份资源,并且这个资源是OS提供的 而共享内存(Share memory)就是在内核共享内存区找一块物理内存空间,并允许多个进程共…

远距离、高品质、低延迟、高保真——SA316无线音频模块带您探索新的音频体验

SA316系列产品分为发射端模块SA316S-TX,SA316F30和接收端模块SA316-RX&#xff0c;该系列方案采用了无线高品质的语音传输芯片来设计&#xff0c;它可以支持外部 PCM / IIS 双模数字音频接口&#xff0c;同时模块为客户提供了标准化的串行接口&#xff0c;使用者可通过串口指令…

使用QT完成如图的游戏登录界面 使用信号和槽完成密文明文密码转换,重置账号和密码,登录校验 详细代码在主页下载

头文件: #ifndef LOGINWIDGET_H #define LOGINWIDGET_H #include <QLineEdit> #include <QPushButton> #include <QWidget> class LoginWidget : public QWidget {Q_OBJECT public: LoginWidget(QWidget *parent = 0); ~LoginWidget(); public slots: …

全新神经网络架构KAN一夜爆火!200参数顶30万,MIT华人一作 | 最新快讯

白交衡宇发自凹非寺 量子位公众号 QbitAI 一种全新的神经网络架构 KAN&#xff0c;诞生了&#xff01; 与传统的 MLP 架构截然不同&#xff0c;且能用更少的参数在数学、物理问题上取得更高精度。 比如&#xff0c;200 个参数的 KANs&#xff0c;就能复现 DeepMind 用 30 万参数…

SpringCloud整合Gateway结合Nacos

目录 一、引入依赖 二、开启两个测试项目 2.1 order service ​编辑 2.2 user service 三、gateway项目 3.1 新建一个bootstrap.yml文件 3.2 将我们的的网关配置写道nacos里的配置里 3.3 测试&#xff1a;看能够根据网关路由到两个测试的项目 四、 优化 4.1 将项目打包…

低空经济+飞行汽车:eVTOL技术详解

低空经济是以各种有人驾驶和无人驾驶航空器的各类低空飞行活动为牵引&#xff0c;辐射带动相关领域融合发展的综合性经济形态。它广泛体现于第一、第二、第三产业之中&#xff0c;在促进经济发展、加强社会保障、服务国防事业等方面发挥着日益重要的作用。 飞行汽车&#xff0c…

## CSDN创作活动:缓解工作压力:程序员的健康之道

缓解工作压力&#xff1a;程序员的健康之道 在当今快节奏的社会中&#xff0c;程序员作为一个高度专业化和技术密集的群体&#xff0c;往往需要面对持续的工作压力和创新挑战。在如此高强度的工作环境下&#xff0c;如何有效缓解工作压力&#xff0c;保持工作效率和个人健康成…

7个AI工具助力产品管理提升

大家好&#xff0c;人工智能AI技术不断进步&#xff0c;AI在产品管理领域的应用也日益广泛。AI以辅助者的角色助力提升产品优化流程的效率&#xff0c;同时激发创新&#xff0c;是不可或缺的强大伙伴。本文将介绍七个AI工具&#xff0c;旨在自动化产品管理者的日常工作流程&…

Unity SteamVR入门

概述 VR项目现在在当前已经是非常热门的技术&#xff0c;可以给玩家身临其境的感觉&#xff0c;接下来让我们学习这部分的内容吧&#xff01; SteamVR Input SteamVR绑定流程&#xff0c;在Windows窗口的点击SteamVR-input&#xff0c;图1&#xff0c;在这里可以选择你需要绑定…

探秘Redis分布式锁:实战与注意事项

【更多精彩内容,欢迎关注小米的微信公众号“软件求生”】 大家好!我是小米,一个热爱分享技术的29岁技术达人。今天,我们来聊聊一个很有意思的主题——Redis分区容错之分布式锁。在分布式系统中,锁是一个非常重要的概念,它能确保系统中资源的并发访问不会出现问题。Redis…

如何使用Go语言进行基准测试(benchmark)?

文章目录 一、基准测试的基本概念二、编写基准测试函数三、运行基准测试四、优化代码性能五、注意事项总结 在Go语言中&#xff0c;基准测试&#xff08;benchmark&#xff09;是一种评估代码性能的有效方式。通过基准测试&#xff0c;我们可以测量代码执行的时间、内存使用情况…

【CANoe示例分析】TCP Chat(CAPL) with TLS encription

1、工程路径 C:\Users\Public\Documents\Vector\CANoe\Sample Configurations 15.3.89\Ethernet\Simulation\TLSSimChat 在CANoe软件上也可以打开此工程:File|Help|Sample Configurations|Ethernet - Simulation of Ethernet ECUs|Basic AUTOSAR Adaptive(SOA) 2、示例目…

快速掌握Element-Ul,构建高效网页应用【AI写作】

首先&#xff0c;这篇文章是基于笔尖AI写作进行文章创作的&#xff0c;喜欢的宝子&#xff0c;也可以去体验下&#xff0c;解放双手&#xff0c;上班直接摸鱼~ 按照惯例&#xff0c;先介绍下这款笔尖AI写作&#xff0c;宝子也可以直接下滑跳过看正文~ 笔尖Ai写作&#xff1a;…

并发编程之线程池的设计和原理

一、线程池 提前创建一系列的线程&#xff0c;保存在这个线程池中&#xff0c;有任务要执行的时候&#xff0c;从线程池中取出线程来执行。没有任务的时候&#xff0c;线程池放回去。 二、为什么要使用线程池 线程使用上的问题: 线程的频繁创建 和 销毁 线程的数量过多&…

注册表获取autoCAD安装位置

注意事项 注意&#xff1a;①64位操作系统注册表会重定向&#xff0c;RegOpenKeyEx第4个参数得加上KEY_WOW64_64KEY&#xff1b;②RegOpenKeyEx遍历子项时注意第2和第4参数&#xff0c;参考图&#xff1a; ③RegQueryValueEx同样得注意第6参数 完整代码 std::unordered_map…

Mybatis进阶(映射关系多对一 )

文章目录 1.需求分析2.应用实例&#xff08;xml配置&#xff09;1.数据表设计2.entity设计&#xff08;不要使用toString会栈溢出&#xff09;1.Pet.java2.User.java 3.编写Mapper1.PetMapper.java2.UserMapper.java 4.编写Mapper.xml1.UserMapper.xml2.PetMapper.xml 5.测试Us…