【第四篇】Volley修改之GsonRequest

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介: json解析工具类的引入,这里引用lite马天宇的解析json的工具类: public class GsonImpl extends Json { private Gson gson = new Gson(); @Override public String toJson(Object src) { return gson.

json解析工具类的引入,这里引用lite马天宇的解析json的工具类:

public class GsonImpl extends Json {
    private Gson gson = new Gson();

    @Override
    public String toJson(Object src) {
        return gson.toJson(src);
    }

    @Override
    public <T> T toObject(String json, Class<T> claxx) {
        return gson.fromJson(json, claxx);
    }

    @Override
    public <T> T toObject(byte[] bytes, Class<T> claxx) {
        return gson.fromJson(new String(bytes), claxx);
    }

}
public abstract class Json {
    private static Json json;

    Json() {}

    public static Json get() {
        if (json == null) {
            json = new GsonImpl();
        }
        return json;
    }

    public abstract String toJson(Object src);

    public abstract <T> T toObject(String json, Class<T> claxx);

    public abstract <T> T toObject(byte[] bytes, Class<T> claxx);
}

集成子Request,在parseNetworkResponse方法里面封装解析json的逻辑

public class GsonRequest<T> extends Request<T> {
    private Class<T> mClazz;
    private Listener<T> listener;
    private Map<String, String> headers;

    /**
     * 
     * @param method
     *            請求方式
     * @param url
     *            获取json的url
     * @param clazz
     *            json对应的javaBean
     * @param headers
     *            头文件
     * @param listener
     *            监听
     * @param errorListener
     *            错误监听
     */

    public GsonRequest(int method, String url, Class<T> clazz,
            Map<String, String> headers, Listener<T> listener,
            ErrorListener errorListener) {
        super(method, url, errorListener);
        this.mClazz = clazz;
        this.headers = headers;
        this.listener = listener;
    }

    /**
     * 获取头文件
     */
    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        return headers != null ? headers : super.getHeaders();
    }

    /**
     * 解析json
     */
    @Override
    protected Response<T> parseNetworkResponse(NetworkResponse response) {
        String jsonString;
        try {
            jsonString = new String(response.data,
                    HttpHeaderParser.parseCharset(response.headers));
            return Response.success(
                    GsonImpl.get().toObject(jsonString, mClazz),
                    HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        }
    }

    /**
     * 分发返回内容
     */
    @Override
    protected void deliverResponse(T response) {
        listener.onResponse(response);
    }
}

使用demo:

1 ,添加网络权限;

2,编码:

http://www.weather.com.cn/data/sk/101010100.html里面的json数据如下:

{"weatherinfo":{"city":"北京","cityid":"101010100","temp":"9","WD":"西南风","WS":"2级","SD":"22%","WSE":"2","time":"10:45","isRadar":"1","Radar":"JC_RADAR_AZ9010_JB","njd":"暂无实况","qy":"1014"}}

对应的javaBean为如下两个类:

public class Weather implements Serializable{
    private static final long serialVersionUID = 1L;
    private Weatherinfo weatherinfo;  
      
    public Weatherinfo getWeatherinfo() {  
        return weatherinfo;  
    }  
  
    public void setWeatherinfo(Weatherinfo weatherinfo) {  
        this.weatherinfo = weatherinfo;  
    }

    @Override
    public String toString() {
        return "Weather [weatherinfo=" + weatherinfo + "]";
    }  
}

 

和Weatherinfo类:

public class Weatherinfo implements Serializable{

    private static final long serialVersionUID = 1L;
    private String city;
    private String cityid;
    private String temp;
    private String WD;
    private String WS;
    private String SD;
    private String WSE;
    private String time;
    private String isRadar;
    private String Radar;
    private String njd;
    private String qy;

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getCityid() {
        return cityid;
    }

    public void setCityid(String cityid) {
        this.cityid = cityid;
    }

    public String getTemp() {
        return temp;
    }

    public void setTemp(String temp) {
        this.temp = temp;
    }

    public String getWD() {
        return WD;
    }

    public void setWD(String wD) {
        WD = wD;
    }

    public String getWS() {
        return WS;
    }

    public void setWS(String wS) {
        WS = wS;
    }

    public String getSD() {
        return SD;
    }

    public void setSD(String sD) {
        SD = sD;
    }

    public String getWSE() {
        return WSE;
    }

    public void setWSE(String wSE) {
        WSE = wSE;
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }

    public String getIsRadar() {
        return isRadar;
    }

    public void setIsRadar(String isRadar) {
        this.isRadar = isRadar;
    }

    public String getRadar() {
        return Radar;
    }

    public void setRadar(String radar) {
        Radar = radar;
    }

    public String getNjd() {
        return njd;
    }

    public void setNjd(String njd) {
        this.njd = njd;
    }

    public String getQy() {
        return qy;
    }

    public void setQy(String qy) {
        this.qy = qy;
    }

    @Override
    public String toString() {
        return "Weatherinfo [city=" + city + ", cityid=" + cityid + ", temp="
                + temp + ", WD=" + WD + ", WS=" + WS + ", SD=" + SD + ", WSE="
                + WSE + ", time=" + time + ", isRadar=" + isRadar + ", Radar="
                + Radar + ", njd=" + njd + ", qy=" + qy + "]";
    }

}

Activity里面:

public class MainActivity extends Activity {
    private String url = "http://www.weather.com.cn/data/sk/101010100.html";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        RequestQueue mQueue = Volley.newRequestQueue(this);
        GsonRequest<Weather> request = new GsonRequest<Weather>(Method.GET, url, Weather.class, null, new Response.Listener<Weather>() {

            @Override
            public void onResponse(Weather response) {
                Toast.makeText(getApplicationContext(), response.toString(), Toast.LENGTH_LONG).show();
            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show();
            }
        });
        mQueue.add(request);
        
    }
}

 

相关文章
|
6月前
|
JavaScript Java 测试技术
《手把手教你》系列技巧篇(四十六)-java+ selenium自动化测试-web页面定位toast-下篇(详解教程)
【5月更文挑战第10天】本文介绍了使用Java和Selenium进行Web自动化测试的实践,以安居客网站为例。最后,提到了在浏览器开发者工具中调试和观察页面元素的方法。
58 2
|
6月前
|
Web App开发 JavaScript 测试技术
《手把手教你》系列技巧篇(四十五)-java+ selenium自动化测试-web页面定位toast-上篇(详解教程)
【5月更文挑战第9天】本文介绍了在Appium中处理App自动化测试中遇到的Toast元素定位的方法。Toast在Web UI测试中也常见,通常作为轻量级反馈短暂显示。文章提供了两种定位Toast元素的技巧.
57 0
|
Web App开发 设计模式 JavaScript
creator源码阅读系列之第一篇源码总览
creator源码阅读系列之第一篇源码总览
|
设计模式 XML 缓存
Android体系课学习 之 网络请求库Retrofit源码分析-看这一篇就够了
- 网络请求在我们开发中起的很大比重,有一个好的网络框架可以节省我们的开发工作量,也可以避免一些在开发中不该出现的bug - *Retrofit*是一个轻量级框架,基于*OkHttp*的一个*Restful*框架
|
设计模式 JSON 缓存
Android体系课学习 之 网络请求库Retrofit使用方式(附Demo)
- 网络请求在我们开发中起的很大比重,有一个好的网络框架可以节省我们的开发工作量,也可以避免一些在开发中不该出现的bug - Retrofit是一个轻量级框架,基于OkHttp的一个Restful框架
|
JSON 数据格式
Volley使用原理笔记
Volley使用原理笔记
|
缓存 网络协议 Java
OkHttp源码详解之二完结篇
OkHttp源码详解之二完结篇
OkHttp源码详解之二完结篇
|
Android开发
动手造轮子——用Builder模式撸一个通用版本的Dialog 前言
  在Android开发中我们常常需要使用Dialog来处理一些弹窗操作。虽然Android系统本身为我们封装了一个自带的弹窗Dialog,但是由于Android操作系统的不同,导致了每个手机弹窗页面的不同,以至于我们很难用系统的去统一样式。
864 0
|
Java Android开发 安全
Android八门神器(一):OkHttp框架源码解析
HTTP是我们交换数据和媒体流的现代应用网络,有效利用HTTP可以使我们节省带宽和更快地加载数据,Square公司开源的OkHttp网络请求是有效率的HTTP客户端。
1440 0
|
缓存 安全
AFNetworking 源码探究
1. AFNetworking源码探究(一) —— 基本介绍2. AFNetworking源码探究(二) —— GET请求实现之NSURLSessionDataTask实例化(一)3.
1554 0