一、说在前面
昨天 |
学习了序列化的相关知识 |
今天 |
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