一、说在前面

  昨天

学习了序列化的相关知识

  今天

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、组成

1)网络请求(StringRequest,JsonArrayRequest,JsonObjectRequest,ImageRequest)。
2)图片加载 ImageLoader
3)自定义ImageView NetworkImageView
 

三、案例:获取邯郸市当天的天气信息

1、设计思路

1)api接口介绍:https://api.help.bj.cn/api/?id=45
2)根据api接口和实际需求创建相应的天气实体类。
3)根据天气实体类创建相应的UI界面。
4)创建请求队列,创建StringRequest请求,将请求加入到队列中。
5)将从网上获取的数据(Json格式)使用Gson转换为java对象。
6)将数据与UI界面的组件绑定。

2、代码:

1)api获取的数据格式及:
{
"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;
} }
3)UI界面。
<?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>
4)创建请求队列,创建StringRequest请求,将请求加入到队列中,将从网上获取的数据(Json格式)使用Gson转换为java对象,将数据与UI界面的组件绑定。
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的更多相关文章

  1. android入门学习-天气预报app(一)

    引言 学习<android第一行代码>根据书本开发的天气预报app,主要用于熟练操作android开发(android studio3.0平台). 今天主要分享一下从服务器上获取天气信息, ...

  2. 毕业设计--天气预报App

    9月中旬,开始动手做我的毕业设计了,之前一直在纠结做啥,后来想想,既然是做毕业设计,那就大胆地做点自己没接触过的东西吧.然后网上查找资料得知做天气预报需要用到开放的API,而且要用那种现在还在维护的, ...

  3. 用Swift实现一款天气预报APP(三)

    这个系列的目录: 用Swift实现一款天气预报APP(一) 用Swift实现一款天气预报APP(二) 用Swift实现一款天气预报APP(三) 通过前面的学习,一个天气预报的APP已经基本可用了.至少 ...

  4. 用Swift实现一款天气预报APP(二)

    这个系列的目录: 用Swift实现一款天气预报APP(一) 用Swift实现一款天气预报APP(二) 用Swift实现一款天气预报APP(三) 上篇中主要讲了界面的一些内容,这篇主要讨论网络请求,获得 ...

  5. 天气预报APP(1)

    一个天气预报APP至少应该具备以下功能: *可以罗列出全国所有的省.市.县: *可以查看全国任意城市的天气信息: *可以自由的切换城市,去查看其他城市的天气: *提供手动更新以及后台自动更新天气的功能 ...

  6. React Native指南汇集了各类react-native学习资源、开源App和组件

    来自:https://github.com/ele828/react-native-guide React Native指南汇集了各类react-native学习资源.开源App和组件 React-N ...

  7. 用Swift实现一款天气预报APP(一)

    这个系列的目录: 用Swift实现一款天气预报APP(一) 用Swift实现一款天气预报APP(二) 用Swift实现一款天气预报APP(三) Swift作为现在苹果极力推广的语言,发展的非常快.这个 ...

  8. 基于Android开发的天气预报app(源码下载)

    原文:基于Android开发的天气预报app(源码下载) 基于AndroidStudio环境开发的天气app -系统总体介绍:本天气app使用AndroidStudio这个IDE工具在Windows1 ...

  9. Python Cookbook(第3版)中文版:15.14 传递Unicode字符串给C函数库

    15.14 传递Unicode字符串给C函数库¶ 问题¶ 你要写一个扩展模块,需要将一个Python字符串传递给C的某个库函数,但是这个函数不知道该怎么处理Unicode. 解决方案¶ 这里我们需要考 ...

随机推荐

  1. EBCDIK,EBCDIC,ASCII,shift JIS間の変換

    http://itdoc.hitachi.co.jp/manuals/3020/3020759580/G5950334.HTM#ID01056

  2. Java的下载与安装

    下载Java 如果要是想聊天,那我们就需要腾讯QQ,先把它下载过来安装上,就可以聊天了,那如果是想要开发java程序呢,我们就需要下载一个开发工具包“jdk”,安装上就可以开发了.当然java是属于哪 ...

  3. SpringBoot与Jpa入门

    一.JPA简介 目前JPA主要实现由hibernate和openJPA等. Spring Data JPA 是Spring Data 的一个子项目,它通过提供基于JPA的Repository极大了减少 ...

  4. LoadRunner的Capture Level

    场景:录制loadrunner的web站点 问题:录制的过程中发现除了页面正常的请求外还有些看不懂的请求(包含乱码),脚本如下: web_url("WebTours", " ...

  5. Mac. 修改bash_file

    https://www.cnblogs.com/mokey/p/3542389.html

  6. 从零构建以太坊(Ethereum)智能合约到项目实战——学习笔记10

    P57 .1-Solidity Types - 玩转 Solidity 数组 (Arrays) 学习目标 1.掌握Arrays的可变不可变的创建 2.深度理解可变数组和不可变数组之间的区别 3.二维数 ...

  7. java记录1--接口

    接口(interface)定义:抽象方法和常量值的集合.本质上讲,接口是一种特殊的抽象类 ps:1.接口中定义的属性必须是public static final 的,定义的方法必须是public ab ...

  8. 在这之后的两天又出现了w3wp进程找不到的情况了

    在这之后的两天又出现了w3wp进程找不到的情况了,我做了什么操作呢?无非就是vs中给一个过程附加删除了了一些dll,然后不停的重新生成解决方案,生成成功后,要调试,发现进程又没了. 实验了上面的方法, ...

  9. LaTeX 使用笔记

    实现一个归类样式,如图: 代码: \left\{ \begin{aligned} 监督学习 \left\{ \begin{aligned} 回归 \\ 分类 \end{aligned} \right. ...

  10. sql数据库的基本操作

    命令行 1.显示当前数据库服务器中的数据库列表:mysql> SHOW DATABASES;2.建立数据库:mysql> CREATE DATABASE 库名;3.建立数据表:mysql& ...