Volley自定义Request及使用单例封装RequestQueue
一.自定义Request
Volley的所有的请求的超类型是Resuest,所有我们常用的请求都是这个类的子类,那么我们自定义View肯定也是基于这个类的。
案例:
- 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>();
- /**
- * 设置访问自己服务器时必须传递的参数,密钥等
- */
- 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时肯定有很多请求参数是需要每次都发往服务器校验的,可以在这里设置。
二 使用单例模式(封装RequestQueue )
如果app连接网络比较频繁,最合理的方式就是把RequestQueue实现为单实例类型,并这个实例在app运行的整个生命周期中存活。有两种方式实现 单实例,推荐的一种做法就是实现一个封装了请求队列和其他volley功能的单例类。还有一种不建议使用的方式就是创建一个继承Application的 字类,并在Application.onCreate()方法中创建请求队列。一个静态的单实例类能够以模块化的方式提供同样的功能。
使 用推荐的方式实现单实例最重要的概念就是请求队列对象必须以应用上下文(application context)而不是活动上下文(activity context)的形式进行实例化。以此确保了请求队列对象在app运行的整个生命周期中存在,而不是随着活动的重新创建而创建。结合设计模式单例模式的 实现,来看看MySingleton.java类的实现,这个类提供了一个请求队列和图片加载:
- private static MySingleton mInstance;
- private RequestQueue mRequestQueue;
- private ImageLoader mImageLoader;
- private static Context mCtx;
- private MySingleton(Context context){
- mCtx = context;
- mRequestQueue = getRequestQueue();
- mImageLoader = new ImageLoader(mRequestQueue,n
- new ImageLoader.ImageCache(){
- private final LruCache<String,Bitmap>(20)
- cache = new LruCache<String,Bitmap>(20);
- @Override
- public Bitmap getBitmap(String url){
- return cache.get(url);
- }
- @Override
- public void putBitmap(String url,Bitmap bitmap){
- cache.put(url,bitmap);
- }
- });
- }
- //异步获取单实例
- public static synchronized MySingleton getInstance(Context context){
- if(mInstance == null){
- mInstance = new MySingleton(context);
- }
- return mInstance
- }
- public RequestQueue getRuquestQueue(){
- if(mRequestQueue == null){
- //getApplication()方法返回一个当前进程的全局应用上下文,这就意味着
- //它的使用情景为:你需要一个生命周期独立于当前上下文的全局上下文,
- //即就是它的存活时间绑定在进程中而不是当前某个组建。
- mRequestQueue = Volley.newRequestQueue(mCtx.getApplication());
- }
- return mRequestQueue;
- }
- public <T> void addToRequestQueue(Request<T>req){
- getRequestQueue.add(req);
- }
- public ImageLoader getImageLoader(){
- return mImageLoader;
- }
在上面的代码中,构造方法中封装了请求队列和图片加载,接着就是异步获取实例、获取请求队列、把请求添加到请求队列、获取图片加载。
最后我们使用这个单例类执行请求队列操作:
- //获取请求队列
- RequestQueue queue = MySingleton.getInstance(this.getApplication().
- getRequest();
- .......
- //把请求(在这个例子中请求为StringRequest)添加到请求队列
- MySingleton.getInstance(this).addToRequestQueue(StringRequest);
参考自:
http://my.oschina.net/huangwenwei/blog/287611
http://blog.csdn.net/lmj623565791/article/details/24589837
Volley自定义Request及使用单例封装RequestQueue的更多相关文章
- unity单例封装
# 1.前言本篇主要针对Unity单例模式,完成一个可以重复继承使用的抽象类,减少重复的工作与代码.同时,对存在的多种单例进行优劣分析.# 2.Unity单例问题分析## 2.1 单例原则单例要满足以 ...
- [Android] 开源框架 Volley 自定义 Request
今天在看Volley demo (https://github.com/smanikandan14/Volley-demo), 发现自定义GsonRequest那块代码不全, 在这里贴一个全的. pu ...
- Kotlin入门(28)Application单例化
Application是Android的又一大组件,在App运行过程中,有且仅有一个Application对象贯穿应用的整个生命周期,所以适合在Application中保存应用运行时的全局变量.而开展 ...
- webx request注入单例增强实现
由于在spring中request对象的scope限制导致了request对象无法直接注入到单例bean中,所以webx对其进行了增强实现,达到单例注入的目的. 实现原理大致如下: 1 启动时注册全局 ...
- Volley(五)—— 自定义Request
详细解读Volley(四)—— 自定义Request Volley中提供了几个Request,如果我们有特殊的需求,完全可以自定义Request的,自定义Request自然要继承Request,那么本 ...
- Android Volley 之自定义Request
转载标明出处:http://blog.csdn.net/lmj623565791/article/details/24589837 今天群里一哥们需要自定义Volley的Request的例子,于是产生 ...
- [iOS]封装单例类
[iOS]封装单例类 今天在学习iOS的SQLite开发,发现在需要使用SQLite的每个视图中,都需要对数据库进行打开或关闭,觉得挺麻烦的:于是在想能否写个单例类对这些操作进行封(因以前一直在使用D ...
- 详细解读Volley(四)—— 自定义Request
Volley中提供了几个Request,如果我们有特殊的需求,完全可以自定义Request的,自定义Request自然要继承Request,那么本篇就教大家来一步一步地定义一个自己的Request类. ...
- log4cpp单例类封装
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
随机推荐
- 大熊君说说JS与设计模式之------单例模式Singleton()
一,总体概要 1,笔者浅谈 顾名思义单例模式并不难理解,是产生一个类的唯一实例,在我们实际开发中也会使用到这种模式,它属于创建模式的一种,基于JS语言本身的语法特征, 对象直接量“{}”,也可以作为单 ...
- C#设计模式(6)——原型模式(Prototype Pattern)
一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...
- 简单理解在Mac OS X上运行ASP.NET程序
运行ASP.NET程序的三要素: 1) CLR(.NET运行时) 2) KRE(ASP.NET运行时) 3) Web服务器 所以在Mac OS X上运行ASP.NET程序,就需要对应这三要素的东西: ...
- 第十八章:Android 打包部署
Andriod应用程序如果要在手机或模拟器上安装,必须要有签名! 1.签名的意义 为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序, ...
- (译)开发优秀的虚拟现实体验:从开发I Expect You to Die中总结的六个要点
这篇文章是我从网上找来的,我觉得他非常详细的解释了VR发展的需求和必要.我认为通过这篇文章可以让大家了解VR. 译者写在最前: 来到追光动画有好几个月了,抱歉这段时间也没有什么文章与大家分享,我现在在 ...
- sqlserver 链接 ODBC 访问 MySql
环境:windows 2008 + sqlserver 2008 一 安装 mysql-connector-odbc-5.2.5-winx64.msi 必须安装5.2.5,安装mysql-connec ...
- 单线程&浏览器多线程
知乎答案:http://www.zhihu.com/question/31982417/answer/54136684 copy大牛的好文:from http://www.cnblogs.com/Ma ...
- paip.自定义java 泛型类与泛型方法的实现总结
paip.自定义java 泛型类与泛型方法的实现总结 ============泛型方法 public static <atiType,retType> retType reduce ...
- unsigned long类型转换为CString出现的问题
开发工具:VC2010 财务程序读卡时发现有的卡片读出的卡号异常,代码如下: // 读卡序列号 unsigned long cardNo; CICReader reader(ICREADER_TYPE ...
- INSERT INTO .. ON DUPLICATE KEY更新多行记录
现在问题来了,如果INSERT多行记录, ON DUPLICATE KEY UPDATE后面字段的值怎么指定?要知道一条INSERT语句中只能有一个ON DUPLICATE KEY UPDATE,到底 ...