一、说在前面
昨天 |
学习了序列化的相关知识 |
今天 |
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
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);
}
}
四、案例运行测试