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){//拼接天气urlString 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()){@Overridepublic 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、qingint 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);}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);initView();}//这里需要用下来关联自定义的布局怎么关联呢//需要Adapterprivate 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() {@Overridepublic void onItemSelected(AdapterView<?> parent, View view, int position, long id) {//选中城市后会开始获取天气String selectCity=mCities[position];getWeatherOfCity(selectCity);}@Overridepublic 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() {@Overridepublic 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.mzph.cn/diannao/5905.shtml

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

相关文章

前端业务开发中使用原生js和elementui两种方式实现头像裁切上传的功能

日常业务开发中&#xff0c;无论是后台管理系统还是前台界面&#xff0c;都会遇到图片裁剪的业务需求&#xff0c;选择合适的尺寸或者图片的关键部分&#xff0c;满足我们的功能需求&#xff01;&#xff01; 效果预览 效果一&#xff1a; 效果二: 实现过程 1.原生js实现方…

VS(Visual Studio)中查找项目里的中文字符

目录 正则表达式查找中文字符 正则表达式查找中文字符 在Visual Studio (VS) 中查找所有的中文字符&#xff0c;你可以使用其强大的查找和替换功能。不过&#xff0c;由于中文字符的范围非常广泛&#xff08;包括简体中文、繁体中文、日本汉字、韩国汉字等&#xff09;&#xf…

GPT3 终极指南(一)

原文&#xff1a;zh.annas-archive.org/md5/6de8906c86a2711a5a84c839bec7e073 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 前言 GPT-3&#xff0c;或者说是 Generative Pre-trained Transformer 3&#xff0c;是由 OpenAI 开发的基于 Transformer 的大型语言模型…

平安城市 校园 景区 停车场网络语音对讲立柱SV-11TS

平安城市 校园 景区 停车场网络语音对讲立柱SV-11TS 长方形立柱式设计&#xff0c;外观简约&#xff0c;线条优美&#xff0c;工艺考究&#xff0c;坚固耐用可一键实现在紧急情况下求助报警、事件咨询&#xff0c;与SIP网络对讲主机进行全双工对讲。内置警示灯&#xff0c;呼叫…

iOS ------ Method Swizzling (动态方法交换)

一&#xff0c;Method Swizzling 简介 Method&#xff08;方法&#xff09;对应的是objc_method结构体&#xff1b;而objc_method结构体中包含了SEL method_name(方法名&#xff09;&#xff0c;IMP method_imp&#xff08;方法实现&#xff09; // objc_method 结构体 typed…

Linux下启动jenkins报错问题解决

jenkins端口报错 java.io.IOException: Failed to start Jettyat winstone.Launcher.<init>(Launcher.java:209)at winstone.Launcher.main(Launcher.java:496)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at java.base/jdk.int…

【题目】2023年全国职业院校技能大赛 GZ073 网络系统管理赛项赛题第3套A模块

2023年全国职业院校技能大赛 GZ073网络系统管理赛项 赛题第3套 信息安全管理与评估 网络系统管理 网络搭建与应用 云计算 软件测试 移动应用开发等多个赛项技术支持 任务书&#xff0c;赛题&#xff0c;解析等资料&#xff0c;知识点培训服务 添加博主wx&#xff1a;liuliu54…

全国产化BMC子卡详细介绍

一款基于全国产的BMC子卡&#xff0c;可实现ChMC/IPMC功能。子卡遵循IPMI 1.5/2.0协议规范&#xff0c;也支持客制OEM命令。子卡可获取载板板卡环境信息&#xff0c;板卡属性信息和板卡状态信息等&#xff0c;其中包括温度、电压、电流等信息&#xff1b;FRU、系统版本、CPU型号…

Django整合多种认证方式

承接上一篇&#xff1a;Django知识点总结-CSDN博客 目录 25.使用 Django REST framework实现用户认证和授权 26.通过djangorestframework-simplejwt使用JWT(JSON Web Token) 27.使用django-auth-ldap进行用户认证 28. 使用django-cas-ng实现集中认证及实现单点登录 29. …

实时监控视频拼接系统:功能和拼接参数介绍

目录 一、实时视频拼接系统介绍 &#xff08;一&#xff09;实时视频拼接的定义 &#xff08;二&#xff09;主要功能 1、视频拼接 2、拼接形式选择 3、前端选择 4、拼接展示 5、数据处理效率提升 6、任务管理 &#xff08;三&#xff09;实时拼接效果 二、拼接需要…

【JavaEE】Thread的方法和属性

文章目录 1、Thread的常见构造方法2、Thread的几个常见属性2.1 ID2.2 名称2.3 状态2.4 优先级2.5 是否后台线程2.6 是否存活2.7 是否被中断 3.补充说明3.1 Thread.sleep()的作用3.2 Thread.sleep()的异常处理方式 1、Thread的常见构造方法 方法说明Thread()创建线程对象Thread…

10G MAC层设计系列-(2)MAC RX模块

一、概述 MAC RX模块的需要进行解码、对齐、CRC校验。 因为在空闲的时候10G PCS/PMA会一直向外吐空闲符&#xff08;x07&#xff09;所以需要根据开始符、结束符将有效数据从码流中截取&#xff0c;也就是解码。 因为开始字符的所在位置有两种形式&#xff0c;而结束字符的位…

白盒测试与黑盒测试区别和联系

一、概念辨析 白盒测试 黑盒测试 二、其他测试方法 三、相关练习

算法训练营第十三天 | LeetCode 239 滑动窗口最大值、LeetCode 347 前K个高频元素

LeetCode 239 滑动窗口最大值 本体初始思路是这样的&#xff0c;首先看下给定数组长度和维持一个滑动窗口所需要花费的时间复杂度之间的关系。初步判断是还行的&#xff0c;当然后面被样例打脸了。需要更新成优先队列的解法。原本的解法能通过37/51和46/51的测试用例。但这还不…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-6.5--I.MX6U启动方式

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

VS Code工具将json数据格式化

诉求&#xff1a;json数据格式化应该在工作中用到的地方特别多&#xff0c;为了更方便、更仔细的对json数据查看&#xff0c;将json数据格式化是非常有必要的。 VS Code中如何将json数据快速格式化 1、在VS Code中安装Beautify JSON插件 2、安装完后在需要格式化的文件中按住…

Web APIs 学习归纳6--- BOM浏览器对象

前面几节主要针对DOM进行了学习&#xff0c;现在开始新的内容的学习---DOM浏览器对象。 DOM是更注重页面&#xff08;document&#xff09;内容的设计&#xff0c;但是BOM不仅限于页面&#xff08;document&#xff09;的设计&#xff0c;而是更加全面包括页面的刷新&#xff0…

【linux学习指南】linux指令与实践文件编写

文章目录 &#x1f4dd;前言&#x1f320; linux目录结构&#x1f309;linux命令介绍 &#x1f320;pwd命令&#x1f309;mkdir指令&#xff08;重要&#xff09; &#x1f320;cd 指令&#x1f309;touch指令 &#x1f320;rmdir指令 && rm 指令&#xff08;重要&…

抖音评论区精准获客自动化获客释放双手

挺好用的&#xff0c;评论区自动化快速获客&#xff0c;如果手动点引流涨&#xff0c;那就很耗费时间了&#xff0c;不是吗&#xff1f; 网盘自动获取 链接&#xff1a;https://pan.baidu.com/s/1lpzKPim76qettahxvxtjaQ?pwd0b8x 提取码&#xff1a;0b8x

Dashboard 安装部署

Dashboard 安装部署 Dashboard 安装部署 一&#xff1a;下载 二&#xff1a;部署步骤 1.镜像下载及导入 国内直接拉外网镜像会失败&#xff0c;可在境外下载镜像 查看 deployment 里的镜像版本 Dashboard Deploymentcontainers:- name: kubernetes-dashboardimage: k8s.g…