zoukankan      html  css  js  c++  java
  • 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、组成

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

    四、案例运行测试

     

     




     

  • 相关阅读:
    Spring Cloud Data Flow整合UAA之使用LDAP进行账号管理
    2020,分手快乐;2021,且行且歌
    Spring Cloud Data Flow整合UAA使用外置数据库和API接口
    Spring Cloud Data Flow整合Cloudfoundry UAA服务做权限控制
    Spring自定义转换类,让@Value更方便
    2020年11月CKA新题考试心得体会
    使用Go module和GoLand初始化一个Go项目
    Spring Cloud Gateway简单入门,强大的微服务网关
    vue百度地图实现自定义覆盖物
    vue 中安装使用jquery
  • 原文地址:https://www.cnblogs.com/20183544-wangzhengshuai/p/12312031.html
Copyright © 2011-2022 走看看