Android Volley 之自定义Request

本文介绍了如何在Android开发中使用Volley库创建一个带有身份验证的JSON请求,包括设置请求头、处理网络响应并解析数据,以及使用Gson将JSON字符串转化为对象的过程。
摘要由CSDN通过智能技术生成

}

}, new Response.ErrorListener()

{

@Override

public void onErrorResponse(VolleyError error)

{

Log.e(“TAG”, error.getMessage(), error);

}

});

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(“http://m.weather.com.cn/data/101010100.html”,

null, new Response.Listener()

{

@Override

public void onResponse(JSONObject response)

{

Log.e(“TAG”, response.toString());

}

}, new Response.ErrorListener()

{

@Override

public void onErrorResponse(VolleyError error)

{

Log.e(“TAG”, error.getMessage(), error);

}

});

ImageRequest imageRequest = new ImageRequest(“http://imgt6.bdstatic.com/it/u=2,887966933&fm=19&gp=0.jpg”,

new Response.Listener()

{

@Override

public void onResponse(Bitmap response)

{

mImageView.setImageBitmap(response);

}

}, 0, 0, Config.RGB_565, null);

newRequestQueue.add(stringRequest);

newRequestQueue.add(imageRequest);

newRequestQueue.add(jsonObjectRequest);

基本都是new一个请求,加入请求队列就行了。

好了,下面进入正题,如何自定义自己的Request,其实很简单,咱们打开StringRequest的源码:

public StringRequest(int method, String url, Listener listener,

ErrorListener errorListener) {

super(method, url, errorListener);

mListener = listener;

}

构造方法中指明访问的url,method,和回调的接口,毕竟我们要处理数据么。

@Override

protected Response parseNetworkResponse(NetworkResponse response) {

String parsed;

try {

parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));

} catch (UnsupportedEncodingException e) {

parsed = new String(response.data);

}

return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));

}

最终给我们返回的数据就是parsed,比如我们返回的是json字符串,我们就可以在这添几行代码,把字符串转换成对象返回。(很重要的是,返回类型是咱们声明Request的时候定的,是个泛型)。

下面直接上例子:

例子是,通过客户端访问服务器,服务器对客户端进行身份校验后,返回JSON字符串,客户端直接拿到对象。

1、对象:

package com.zhy.velloydemo;

public class User

{

private String name;

private int age;

public String getName()

{

return name;

}

public void setName(String name)

{

this.name = name;

}

public int getAge()

{

return age;

}

public void setAge(int age)

{

this.age = age;

}

@Override

public String toString()

{

return “User [name=” + name + “, age=” + age + “]”;

}

}

2、自定义的Request

package com.zhy.velloydemo;

import java.io.UnsupportedEncodingException;

import java.util.HashMap;

import java.util.Map;

import com.android.volley.AuthFailureError;

import com.android.volley.NetworkResponse;

import com.android.volley.ParseError;

import com.android.volley.Request;

import com.android.volley.Response;

import com.android.volley.Response.ErrorListener;

import com.android.volley.Response.Listener;

import com.android.volley.toolbox.HttpHeaderParser;

import com.google.gson.Gson;

import com.google.gson.JsonSyntaxException;

public class JsonRequestWithAuth extends Request

{

private final Gson gson = new Gson();

private final Class clazz;

private final Listener listener;

private static Map<String, String> mHeader = new HashMap<String, String>();

/**

  • 设置访问自己服务器时必须传递的参数,密钥等

*/

static

{

mHeader.put(“APP-Key”, “LBS-AAA”);

mHeader.put(“APP-Secret”, “ad12msa234das232in”);

}

/**

  • @param url

  • @param clazz

  •        我们最终的转化类型
    
  • @param headers

  •        请求附带的头信息
    
  • @param listener

  • @param appendHeader

  •        附加头数据
    
  • @param errorListener

*/

public JsonRequestWithAuth(String url, Class clazz, Listener listener, Map<String, String> appendHeader,

ErrorListener errorListener)

{

super(Method.GET, url, errorListener);

this.clazz = clazz;

this.listener = listener;

mHeader.putAll(appendHeader);

}

@Override

public Map<String, String> getHeaders() throws AuthFailureError

{

// 默认返回 return Collections.emptyMap();

return mHeader;

}

@Override

protected void deliverResponse(T response)

{

listener.onResponse(response);

}

@Override

protected Response parseNetworkResponse(NetworkResponse response)

{

try

{

/**

  • 得到返回的数据

*/

String jsonStr = new String(response.data, HttpHeaderParser.parseCharset(response.headers));

/**

  • 转化成对象

*/

return Response.success(gson.fromJson(jsonStr, clazz), HttpHeaderParser.parseCacheHeaders(response));

Android开发除了flutter还有什么是必须掌握的吗?

相信大多数从事Android开发的朋友们越来越发现,找工作越来越难了,面试的要求越来越高了

除了基础扎实的java知识,数据结构算法,设计模式还要求会底层源码,NDK技术,性能调优,还有会些小程序和跨平台,比如说flutter,以思维脑图的方式展示在下图;

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

的吗?

相信大多数从事Android开发的朋友们越来越发现,找工作越来越难了,面试的要求越来越高了

除了基础扎实的java知识,数据结构算法,设计模式还要求会底层源码,NDK技术,性能调优,还有会些小程序和跨平台,比如说flutter,以思维脑图的方式展示在下图;

[外链图片转存中…(img-DKW8ywwh-1714299023497)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 23
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值