2.15 学习总结 之 天气预报APP volley(HTTP库)之StringRequest
一、说在前面
| 昨天 |
学习了序列化的相关知识 |
| 今天 |
1、学习 volley(HTTP库)的 StringRequest请求 2、使用序列化完成相关案例 |
| 遇到问题 |
请求到的参数的出现中文乱码问题 |
问题的解决:自定义StringRequest类 修改volley编码为utf-8, 默认为Latin1 中文显示乱码。
package com.me.myvolley; import androidx.annotation.Nullable; import com.android.volley.NetworkResponse;
import com.android.volley.Response;
import com.android.volley.toolbox.HttpHeaderParser;
import com.android.volley.toolbox.StringRequest; import java.io.UnsupportedEncodingException; public class Utf8StringRequest extends StringRequest { public Utf8StringRequest(int method, String url, Response.Listener<String> listener, @Nullable Response.ErrorListener errorListener) {
super(method, url, listener, errorListener);
} @Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
String parsed = "";
try {
parsed = new String(response.data,"utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
}
}
二、volley 简介
1、特点
1)Volley是一个HTTP库,它使Android应用程序的网络更容易,最重要的是,更快,适合高并发的网络请求。网络请求 cancel 机制。我们可以取消单个请求,或者指定取消请求队列中的一个区域;自动调度网络请求;
2)Volley不适合大型下载或流式操作,因为Volley在解析期间将所有响应保存在内存中。对于大型下载操作,请考虑使用类似的替代方法DownloadManager。
2、组成
2)图片加载 ImageLoader
3)自定义ImageView NetworkImageView
三、案例:获取邯郸市当天的天气信息
1、设计思路
2、代码:
{
"status": "0", //反馈代码 0成功
"msg": "反馈信息", //反馈信息
"cityen": "changchun", //城市名称英文
"city": "长春", //城市名称
"citycode": "101060101", //城市编码
"temp": "10", //实时温度
"tempf": "50", //华氏温度
"wd": "西风", //风向
"wden": "W", //风向英文
"wdforce": "3级", //风力
"wdspd": "<12km/h", //风速
"uptime": "12:00", //更新时间
"weather": "晴", //天气状况
"weatheren": "Sunny", //天气状况英文
"weatherimg": "d00", //天气状况图标
"stp": "994", //气压
"wisib": "35000", //能见度
"humidity": "46%", //湿度
"prcp": "0", //降雨
"prcp24h": "2.2", //24小时降雨量
"aqi": "22", //AQI
"pm25": "20", //PM2.5
"today": "10月17日(星期一)" //今天日期
}
2)天气实体类
package com.me.myvolley;
public class TianQi {
private String city;
private String today;
private String weather;
private int pm25;
private int temp;
private String wd;
private String wdforce;
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getToday() {
return today;
}
public void setToday(String today) {
this.today = today;
}
public String getWeather() {
return weather;
}
public void setWeather(String weather) {
this.weather = weather;
}
public int getPm25() {
return pm25;
}
public void setPm25(int pm25) {
this.pm25 = pm25;
}
public int getTemp() {
return temp;
}
public void setTemp(int temp) {
this.temp = temp;
}
public String getWd() {
return wd;
}
public void setWd(String wd) {
this.wd = wd;
}
public String getWdforce() {
return wdforce;
}
public void setWdforce(String wdforce) {
this.wdforce = wdforce;
}
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
tools:context=".MainActivity"> <TextView
android:id="@+id/textViewWdforce"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="36sp"
app:layout_constraintBottom_toTopOf="@+id/guideline"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textViewWd"
tools:text="tianqi" /> <TextView
android:id="@+id/textViewCity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/title_font_size"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.05"
tools:text="handan1111" /> <TextView
android:id="@+id/textViewDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="36sp"
app:layout_constraintBottom_toTopOf="@+id/textViewWeather"
app:layout_constraintEnd_toEndOf="@+id/textViewWeather"
app:layout_constraintStart_toStartOf="@+id/textViewWeather"
app:layout_constraintTop_toBottomOf="@+id/textViewCity"
tools:text="tianqi" /> <TextView
android:id="@+id/textViewWeather"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="36sp"
app:layout_constraintBottom_toTopOf="@+id/textViewPm25"
app:layout_constraintEnd_toEndOf="@+id/textViewPm25"
app:layout_constraintStart_toStartOf="@+id/textViewPm25"
app:layout_constraintTop_toBottomOf="@+id/textViewDate"
tools:text="tianqi" /> <TextView
android:id="@+id/textViewPm25"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="36sp"
app:layout_constraintBottom_toTopOf="@+id/textViewTemp"
app:layout_constraintEnd_toEndOf="@+id/textViewTemp"
app:layout_constraintStart_toStartOf="@+id/textViewTemp"
app:layout_constraintTop_toBottomOf="@+id/textViewWeather"
tools:text="tianqi" /> <TextView
android:id="@+id/textViewTemp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="36sp"
app:layout_constraintBottom_toTopOf="@+id/textViewWd"
app:layout_constraintEnd_toEndOf="@+id/textViewWd"
app:layout_constraintStart_toStartOf="@+id/textViewWd"
app:layout_constraintTop_toBottomOf="@+id/textViewPm25"
tools:text="tianqi" /> <TextView
android:id="@+id/textViewWd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="36sp"
app:layout_constraintBottom_toTopOf="@+id/textViewWdforce"
app:layout_constraintEnd_toEndOf="@+id/textViewWdforce"
app:layout_constraintStart_toStartOf="@+id/textViewWdforce"
app:layout_constraintTop_toBottomOf="@+id/textViewTemp"
tools:text="tianqi" /> <androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.9" />
</androidx.constraintlayout.widget.ConstraintLayout>
package com.me.myvolley; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle;
import android.widget.TextView; import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.google.gson.Gson; public class MainActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//String url = "https://www.baidu.com";
String url = "https://api.help.bj.cn/apis/weather/?id=101091001";
final TextView textViewWeather = findViewById(R.id.textViewWeather);
final TextView textViewCity = findViewById(R.id.textViewCity);
final TextView textViewDate = findViewById(R.id.textViewDate);
final TextView textViewPm25 = findViewById(R.id.textViewPm25);
final TextView textViewTemp = findViewById(R.id.textViewTemp);
final TextView textViewWd = findViewById(R.id.textViewWd);
final TextView textViewWdforce = findViewById(R.id.textViewWdforce);
//1、创建一个队列
RequestQueue queue = Volley.newRequestQueue(this);
//2、创建一个request
final Utf8StringRequest request = new Utf8StringRequest(
StringRequest.Method.GET, //1、请求方式
url, //2、请求网址
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Gson gson = new Gson();
TianQi tianQi = gson.fromJson(response,TianQi.class);
textViewCity.setText(tianQi.getCity());
textViewDate.setText(tianQi.getToday());
textViewPm25.setText("PM2.5:" + String.valueOf(tianQi.getPm25()));
textViewTemp.setText("温度:" + String.valueOf(tianQi.getTemp()));
textViewWd.setText("风向:" + tianQi.getWd());
textViewWdforce.setText("风力:" + tianQi.getWdforce());
textViewWeather.setText("天气:" + tianQi.getWeather());
//First first = gson.fromJson(response,First.class);
//textView.setText(response);
}
}, //3、成功的回调函数
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
textViewCity.setText("请求错误!");
}
} //4、失败的回调函数
);
queue.add(request);
}
}
四、案例运行测试

2.15 学习总结 之 天气预报APP volley(HTTP库)之StringRequest的更多相关文章
- android入门学习-天气预报app(一)
引言 学习<android第一行代码>根据书本开发的天气预报app,主要用于熟练操作android开发(android studio3.0平台). 今天主要分享一下从服务器上获取天气信息, ...
- 毕业设计--天气预报App
9月中旬,开始动手做我的毕业设计了,之前一直在纠结做啥,后来想想,既然是做毕业设计,那就大胆地做点自己没接触过的东西吧.然后网上查找资料得知做天气预报需要用到开放的API,而且要用那种现在还在维护的, ...
- 用Swift实现一款天气预报APP(三)
这个系列的目录: 用Swift实现一款天气预报APP(一) 用Swift实现一款天气预报APP(二) 用Swift实现一款天气预报APP(三) 通过前面的学习,一个天气预报的APP已经基本可用了.至少 ...
- 用Swift实现一款天气预报APP(二)
这个系列的目录: 用Swift实现一款天气预报APP(一) 用Swift实现一款天气预报APP(二) 用Swift实现一款天气预报APP(三) 上篇中主要讲了界面的一些内容,这篇主要讨论网络请求,获得 ...
- 天气预报APP(1)
一个天气预报APP至少应该具备以下功能: *可以罗列出全国所有的省.市.县: *可以查看全国任意城市的天气信息: *可以自由的切换城市,去查看其他城市的天气: *提供手动更新以及后台自动更新天气的功能 ...
- React Native指南汇集了各类react-native学习资源、开源App和组件
来自:https://github.com/ele828/react-native-guide React Native指南汇集了各类react-native学习资源.开源App和组件 React-N ...
- 用Swift实现一款天气预报APP(一)
这个系列的目录: 用Swift实现一款天气预报APP(一) 用Swift实现一款天气预报APP(二) 用Swift实现一款天气预报APP(三) Swift作为现在苹果极力推广的语言,发展的非常快.这个 ...
- 基于Android开发的天气预报app(源码下载)
原文:基于Android开发的天气预报app(源码下载) 基于AndroidStudio环境开发的天气app -系统总体介绍:本天气app使用AndroidStudio这个IDE工具在Windows1 ...
- Python Cookbook(第3版)中文版:15.14 传递Unicode字符串给C函数库
15.14 传递Unicode字符串给C函数库¶ 问题¶ 你要写一个扩展模块,需要将一个Python字符串传递给C的某个库函数,但是这个函数不知道该怎么处理Unicode. 解决方案¶ 这里我们需要考 ...
随机推荐
- EBCDIK,EBCDIC,ASCII,shift JIS間の変換
http://itdoc.hitachi.co.jp/manuals/3020/3020759580/G5950334.HTM#ID01056
- Java的下载与安装
下载Java 如果要是想聊天,那我们就需要腾讯QQ,先把它下载过来安装上,就可以聊天了,那如果是想要开发java程序呢,我们就需要下载一个开发工具包“jdk”,安装上就可以开发了.当然java是属于哪 ...
- SpringBoot与Jpa入门
一.JPA简介 目前JPA主要实现由hibernate和openJPA等. Spring Data JPA 是Spring Data 的一个子项目,它通过提供基于JPA的Repository极大了减少 ...
- LoadRunner的Capture Level
场景:录制loadrunner的web站点 问题:录制的过程中发现除了页面正常的请求外还有些看不懂的请求(包含乱码),脚本如下: web_url("WebTours", " ...
- Mac. 修改bash_file
https://www.cnblogs.com/mokey/p/3542389.html
- 从零构建以太坊(Ethereum)智能合约到项目实战——学习笔记10
P57 .1-Solidity Types - 玩转 Solidity 数组 (Arrays) 学习目标 1.掌握Arrays的可变不可变的创建 2.深度理解可变数组和不可变数组之间的区别 3.二维数 ...
- java记录1--接口
接口(interface)定义:抽象方法和常量值的集合.本质上讲,接口是一种特殊的抽象类 ps:1.接口中定义的属性必须是public static final 的,定义的方法必须是public ab ...
- 在这之后的两天又出现了w3wp进程找不到的情况了
在这之后的两天又出现了w3wp进程找不到的情况了,我做了什么操作呢?无非就是vs中给一个过程附加删除了了一些dll,然后不停的重新生成解决方案,生成成功后,要调试,发现进程又没了. 实验了上面的方法, ...
- LaTeX 使用笔记
实现一个归类样式,如图: 代码: \left\{ \begin{aligned} 监督学习 \left\{ \begin{aligned} 回归 \\ 分类 \end{aligned} \right. ...
- sql数据库的基本操作
命令行 1.显示当前数据库服务器中的数据库列表:mysql> SHOW DATABASES;2.建立数据库:mysql> CREATE DATABASE 库名;3.建立数据表:mysql& ...