Android Volley 之自己定义Request
转载标明出处:http://blog.csdn.net/lmj623565791/article/details/24589837
今天群里一哥们须要自己定义Volley的Request的样例,于是产生了这篇博客。关于Volley的介绍就不多说了,网上样例特别多。
Volley的全部的请求的超类型是Resuest,类结构例如以下图,全部我们经常使用的请求都是这个类的子类,那么我们自己定义View肯定也是基于这个类的。
一些简单的使用方法实例:
RequestQueue newRequestQueue = Volley.newRequestQueue(MainActivity.this);
StringRequest stringRequest = new StringRequest("http://www.baidu.com", new Response.Listener<String>()
{ @Override
public void onResponse(String response)
{
Log.e("TAG", response); }
}, 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<JSONObject>()
{ @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<Bitmap>()
{ @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,事实上非常easy,咱们打开StringRequest的源代码:
public StringRequest(int method, String url, Listener<String> listener,
ErrorListener errorListener) {
super(method, url, errorListener);
mListener = listener;
}
构造方法中指明訪问的url,method,和回调的接口,毕竟我们要处理数据么。
@Override
protected Response<String> 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的时候定的,是个泛型)。
以下直接上样例:
样例是,通过client訪问server,server对client进行身份校验后,返回JSON字符串,client直接拿到对象。
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<T> extends Request<T>
{
private final Gson gson = new Gson();
private final Class<T> clazz;
private final Listener<T> listener; private static Map<String, String> mHeader = new HashMap<String, String>();
/**
* 设置訪问自己server时必须传递的參数,密钥等
*/
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<T> clazz, Listener<T> 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<T> parseNetworkResponse(NetworkResponse response)
{
try
{
/**
* 得到返回的数据
*/
String jsonStr = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
/**
* 转化成对象
*/
return Response.success(gson.fromJson(jsonStr, clazz), HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e)
{
return Response.error(new ParseError(e));
} catch (JsonSyntaxException e)
{
return Response.error(new ParseError(e));
}
}
}
这里说一下,我在Header中放置了APP-key等数据,也就是说仅仅要我们这个请求发的都会有这几个值,大家开发app时肯定有非常多请求參数是须要每次都发往server校验的,能够在这里设置。
3、server代码:
package com.zhy.servelt; import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class TestServlet extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
this.doPost(request, response);
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
request.setCharacterEncoding("utf-8"); String appKey = request.getHeader("APP-Key");
String appSecret = request.getHeader("APP-Secret"); String username = request.getHeader("username");
String password = request.getHeader("password"); if ("admin".equals(username) && "123".equals(password))
{
response.setContentType("text/plain;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("{\"name\":\"鸿洋\",\"age\":32}");
out.flush(); } } }
4、測试代码:
Map<String, String> appendHeader = new HashMap<String, String>();
appendHeader.put("username", "admin");
appendHeader.put("password", "123"); String url = "http://172.27.35.1:8080/webTest/TestServlet";
JsonRequestWithAuth<User> userRequest = new JsonRequestWithAuth<User>(url, User.class, new Listener<User>()
{
@Override
public void onResponse(User response)
{
Log.e("TAG", response.toString());
}
}, appendHeader, null); newRequestQueue.add(userRequest);
能够看到我们使用自己定义请求实现了我们上述的需求,这里还要说一下,这个样例有两个目的:
1、自己定义Request事实上非常easy,假设不须要Header直接不用复写getHeader那个方法。
2、我们能够利用Header传递一些固定的參数,这比对安全比較高的系统,每次拼一堆xml去server,代码能简洁非常多,当然了,注意信息安全。
最后补充一下:
哥们问这句什么意思:HttpHeaderParser.parseCharset(response.headers)事实上就是获取我们的返回流的编码,也就是我上面server设置的utf-8
对于请求的Header和响应Header理解,随便打开个站点,使用浏览器的工具查看一下,每一个请求都会包括这两个Header数据。
好了,就到这里~各位留个言、赞一个算对我们的支持~
Android Volley 之自己定义Request的更多相关文章
- Android Volley入门到精通:定制自己的Request
经过前面两篇文章的学习,我们已经掌握了Volley各种Request的使用方法,包括StringRequest.JsonRequest.ImageRequest等.其中StringRequest用于请 ...
- Android Volley彻底解决(三),定制自己Request
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17612763 经过前面两篇文章的学习,我们已经掌握了Volley各种Request ...
- Android Volley完全解析(三),定制自己的Request
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17612763 经过前面两篇文章的学习,我们已经掌握了Volley各种Request ...
- Android Volley 之自定义Request
转载标明出处:http://blog.csdn.net/lmj623565791/article/details/24589837 今天群里一哥们需要自定义Volley的Request的例子,于是产生 ...
- [Android]Volley的使用
Volley是Google I/O 2013上提出来的为Android提供简单快速网络访问的项目.Volley特别适合数据量不大但是通信频繁的场景. 优势 相比其他网络载入类库,Volley 的优势官 ...
- Android Volley完全解析
1. Volley简介 我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据.Android系统中主要提供了两种方式来进行H ...
- Android Volley源码分析
今天来顺手分析一下谷歌的volley http通信框架.首先从github上 下载volley的源码, 然后新建你自己的工程以后 选择import module 然后选择volley. 最后还需要更改 ...
- Android Volley 库的使用
本文内容 什么是 Volley 库 Volley 能做什么 Volley 架构 环境 演示 Volley 库的使用 参考资料 Android 关于网络操作一般都会介绍 HttpClient 以及 Ht ...
- Android Volley 库通过网络获取 JSON 数据
本文内容 什么是 Volley 库 Volley 能做什么 Volley 架构 环境 演示 Volley 库通过网络获取 JSON 数据 参考资料 Android 关于网络操作一般都会介绍 HttpC ...
随机推荐
- Ubuntu14.04 用 CrossOver 安装 TMQQ2013
Crossover 是 wine 的优化+商业版本号 , 免去了wine的繁琐配置,让Ubuntu安装windows软件很easy..... 部分移植的软件还有官方的维护,执行效果也比較好..... ...
- STL顺序容器【vector】【deque】【list】
我们都知道,stl在集装箱船分为两类,订购集装箱和相关的容器. 顺序容器有三种即动态数组vector,双端队列deque,以及链表list (对csdn的文字排版严重吐槽.写好的版发表了就变了) 一: ...
- POJ1274 The Perfect Stall【二部图最大匹配】
主题链接: id=1274">http://poj.org/problem? id=1274 题目大意: 有N头奶牛(编号1~N)和M个牛棚(编号1~M). 每头牛仅仅可产一次奶.每一 ...
- java单元测试(Junit)
JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework),供Java开发人员编写单元测试之用. 对不同性质的被 ...
- Spring Assert主张 (参议院检测工具的方法-主张)
Web 收到申请表格提交的数据后都需要对其进行合法性检查,假设表单数据是不合法的,该请求将被拒绝.分类似的,当我们写的类方法,该方法还经常需要组合成参 法国检查.假设参议院不符合要求,方法通过抛出异常 ...
- 基于Velocity开发自己的模板引擎
Velocity是一个基于java的模板引擎(template engine).它同意不论什么人只简单的使用模板语言(template language)来引用由java代码定义的对象. 当Veloc ...
- 使用order by和rownum时特别注意
起因 在项目中有用到某表作为数据来源,在页面以列表的形式显示.使用的数据库是Oracle,分页的时候使用到了rownum这个关键字.列表有排序功能,自然也用到了order by.接下来问题出现了,我在 ...
- 网站通常使用一些javascript包裹 简化电话
//对于Web地址参数 //前面加"=="进行标识,否则直接返回 //解码时依据是否含有"=="标识来决定是否要解码 var base64EncodeChars ...
- 【Web探索之旅】第二部分第二课:服务器语言
内容简介 1.第二部分第二课:服务器语言 2.第二部分第三课预告:框架和内容管理系统 第二部分第二课:服务器语言 介绍了Web的客户端,我们来谈谈Web的服务器端. 既然客户端有客户端的编程语言(HT ...
- 香蕉派路由功Openwrt、Android功耗对照測试
路由这个东西是要长期通电使用的,所以功耗也是须要关注的.如今香蕉派路由已经有了openwrt和android两个 系统,这两个系统的功耗是否一样呢? 測试工具:QUIGG的德国产功耗測试仪一个.手机充 ...