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 ...
随机推荐
- CSDN 分糖果算法的思路和求助
昨天晚上 在csdn上做了一道分糖果的题目,我自个测的是没有问题,但是提交答案后,老失败,提示 你的程序正常运行并输出了结果,但是答案错误你的程序输出结果与测试数据中的输出结果不符 我先把自个思路说一 ...
- 傻逼Eclipse笔记
Eclipse 这么傻逼的工具,还有人用,真是奇了怪了. Invalid project description 我想打开SVN 的代码 ,别让我拷到别的地方,怎么破? 正确答案是: 删除 Eclip ...
- hadoop2.X使用手册1:通过web端口查看主节点、slave1节点及集群运行状态
导读内容:1.如何通过web查看hdfs集群状态2.如何通过web查看运行在在主节点master上ResourceManager状态3.如何通过web查看运行在在slave节点NodeManager资 ...
- 第十七章:android解析JSON
一.解析JSON数据: 首先引入包import org.json.JSONObject;(android sdk 14以后应该自带了 ) Android端的程序解析JSON和JSON数组: packa ...
- VS2012 生成事件
在一个解决方案中有多个项目的时候,我们常需要拷贝一些文件,dll到指定的目录下,或者遇到com组件还需要提前注册dll,这个就需要用到VS的生成事件. 一.位置: 项目-->右键-->属性 ...
- AngularJS快速入门指南06:过滤器
thead>tr>th, table.reference>tbody>tr>th, table.reference>tfoot>tr>th, table ...
- ROCK 聚类算法
ROCK (RObust Clustering using linKs) 聚类算法是一种鲁棒的用于分类属性的聚类算法.该算法属于凝聚型的层次聚类算法.之所以鲁棒是因为在确认两对象(样本点/簇)之间 ...
- 汇编语言hello world
DOS下: ;栈段 stack segment stack db dup(?) stack ends ;数据段 data segment szHello db 'Hello,world',0dh,0a ...
- 文件系统:Ext3和Ext4
一.ext3和ext4的区别: 1.与Ext3兼容:执行若干条命令,就能将Ext3在线迁移到Ext4,而无须重新格式化磁盘或者重新安装系统.原有Ext3数据结构照样保留, Ext4作用于新数据,当然, ...
- PHP类与面向对象(二)
构造函数和析构函数 构造函数PHP 5 允行开发者在一个类中定义一个方法作为构造函数.具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作.如果子类中定义了构造 ...