2.15 学习总结 之 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、组成

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);
    }
}

四、案例运行测试

原文地址:https://www.cnblogs.com/20183544-wangzhengshuai/p/12312031.html

时间: 2024-10-03 10:09:50

2.15 学习总结 之 volley(HTTP库)之StringRequest的相关文章

python基础教程_学习笔记17:标准库:一些最爱——time

标准库:一些最爱 time time模块所包含的函数能够实现以下功能: 获取当前时间.操作系统时间和日期.从字符串读取时间以及格式化时间为字符串. 日期可以用实数(从"新纪元"的1月1日0点开始计算到现在的秒数,新纪元是一个与平台相关的年份,对unix来说是1970年),或者是包含有9个整数的元组. 日期元组的字段含义 如元组: (2008,1,21,12,2,56,0,21,0) 表示2008年1月21日12时2分56秒,星期一,且是当年的第21天(无夏令时). 索引 字段 值 0

C++ Primer(第五版)学习笔记_5_标准模板库string(2)

C++ Primer(第五版)学习笔记_5_标准模板库string(2) 10.搜索string对象的元素或子串 采用find()方法可查找字符串中的第一个字符元素(char, 用单引号界定)或者子串(用双引号界定):如果查到,则返回下标值(从0开始计数),如果查不到,则返回一个很大的数string:npos(即:4294967295). #include <iostream> #include <stdio.h> #include <string> using nam

C++ Primer(第五版)学习笔记_8_标准模板库_map映照容器

C++ Primer(第五版)学习笔记_8_标准模板库_map映照容器 map映照容器的元素数据是由一个键值和一个映照数据组成的,键值与映照数据之间具有一一映照的关系. map映照容器的数据结构也是采用红黑树来实现的. 1.map创建.元素插入和遍历访问 #include <iostream> #include <stdio.h> #include <vector> #include <map> #include <string> using n

C++ Primer 学习笔记_14_标准模板库_bitset位集合容器

C++ Primer 学习笔记_14_标准模板库_bitset位集合容器 bitset容器是一个bit位元素的序列容器,每个元素只占一个bit位,取值为0或1,因而很节省内存空间.下图是一个bitset的存储示意图,它的10个元素只使用了两个字节的空间. 使用bitset需要声明头文件"#include <bitset>" 1.创建bitset对象 创建bitset对象时,必须要指定容器的大小.bitset对象的大小一经定义,就不能修改了.下面这条语句就定义了bitset对

C++ Primer 学习笔记_23_标准模板库_stack.

C++ Primer 学习笔记_11_标准模板库_stack.queue队列容器与priority_queue优先队列容器 1.stack堆栈 stack堆栈是一个后进先出(Last In First Out,LIFO)的线性表,插入和删除元素都只能在表的一端进行.插入元素的一端称为栈顶,而另一端称为栈底.插入元素叫入栈(Push),删除元素叫出栈(Pop).下图是堆栈示意图 堆栈只提供入栈,出栈,栈顶元素访问和判断是否为空等几种方法.采用push()方法将元素入栈:采用pop()方法出栈:采用

C++ Primer 学习笔记_13_标准模板库_list双向链表容器

C++ Primer 学习笔记_13_标准模板库_list双向链表容器 list容器实现了双向链表的数据结构,数据元素是通过链表指针串连成逻辑意义上的线性表,这样,对链表的任一位置的元素进行插入.删除和查找都是超快速的.下图是双向循环链表的结构示意图. list的每个节点有三个域:前驱元素指针域.数据域和后继元素指针域.前驱元素指针域保存了前驱元素的首地址:数据域则是本节点的数据:后继元素指针域则保存了后继元素的首地址.list的头结点的前驱元素指针域保存的是链表中尾元素的首地址,而list的尾

C++学习笔记之字符函数库cctype

C++从C语言继承了一个与字符相关的.非常方便的函数软件包,它可以简化诸如确定字符是否为大写字母.数字.标点符号等工作,这些函数原型是在头文件cctype(老式风格ctype.h)中定义的. 下表对这些函数进行了总结,有些系统可能没有表中列出的函数,也有可能还有在表中没有列出的一些函数. 函数名称 返回值 isalnum() 如果参数是字母数字,即字母或者数字,该函数返回true isalpha() 如果参数是字母,该函数返回true iscntrl() 如果参数是控制字符,该函数返回true

python基础教程_学习笔记16:标准库:一些最爱——random

标准库:一些最爱 random random模块包括返回随机数的函数,可以用于模拟或者用于任何产生随机输出的程序. 事实上,所产生的数字都是伪随机数,它们以一个可预测的系统作为基础,除非是为了强加密的目标,否则这些随机数还是足够随机的.如果真的需要随机性,可以使用os模块的urandom函数. 重要函数 函数 描述 random() 返回0<=n<1之间的随机实数n,其中0<n<=1 getrandbits(n) 以长整型形式返回n个随机位(二进制数) uniform(a,b) 返

python基础教程_学习笔记14:标准库:一些最爱——re

标准库:一些最爱 re re模块包含对正则表达式的支持,因为曾经系统学习过正则表达式,所以基础内容略过,直接看python对于正则表达式的支持. 正则表达式的学习,见<Mastering Regular Expressions>(精通正则表达式) re模块的内容 最重要的一些函数 函数 描述 compile(pattern[,flags]) 根据包含正则表达式的字符串创建模式对象 search(pattern,string[,flags]) 在字符串中寻找模式 match(pattern,st