2.15 学习总结 之 volley(HTTP库)之StringRequest

Posted 20183544-wangzhengshuai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
    }
}

四、案例运行测试

技术图片

 

 




 

以上是关于2.15 学习总结 之 volley(HTTP库)之StringRequest的主要内容,如果未能解决你的问题,请参考以下文章

Android中 网络框架Volley的用法

如何在 Android 中使用 Volley 库进行肥皂发布请求

Android框架之Volley与Glide

Volley获取网络图片使用总结

如何使用Google Volley网络库发起带Header的HTTP请求

关于LocalHost错误的Android Volley库