一.自定义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的更多相关文章

  1. unity单例封装

    # 1.前言本篇主要针对Unity单例模式,完成一个可以重复继承使用的抽象类,减少重复的工作与代码.同时,对存在的多种单例进行优劣分析.# 2.Unity单例问题分析## 2.1 单例原则单例要满足以 ...

  2. [Android] 开源框架 Volley 自定义 Request

    今天在看Volley demo (https://github.com/smanikandan14/Volley-demo), 发现自定义GsonRequest那块代码不全, 在这里贴一个全的. pu ...

  3. Kotlin入门(28)Application单例化

    Application是Android的又一大组件,在App运行过程中,有且仅有一个Application对象贯穿应用的整个生命周期,所以适合在Application中保存应用运行时的全局变量.而开展 ...

  4. webx request注入单例增强实现

    由于在spring中request对象的scope限制导致了request对象无法直接注入到单例bean中,所以webx对其进行了增强实现,达到单例注入的目的. 实现原理大致如下: 1 启动时注册全局 ...

  5. Volley(五)—— 自定义Request

    详细解读Volley(四)—— 自定义Request Volley中提供了几个Request,如果我们有特殊的需求,完全可以自定义Request的,自定义Request自然要继承Request,那么本 ...

  6. Android Volley 之自定义Request

    转载标明出处:http://blog.csdn.net/lmj623565791/article/details/24589837 今天群里一哥们需要自定义Volley的Request的例子,于是产生 ...

  7. [iOS]封装单例类

    [iOS]封装单例类 今天在学习iOS的SQLite开发,发现在需要使用SQLite的每个视图中,都需要对数据库进行打开或关闭,觉得挺麻烦的:于是在想能否写个单例类对这些操作进行封(因以前一直在使用D ...

  8. 详细解读Volley(四)—— 自定义Request

    Volley中提供了几个Request,如果我们有特殊的需求,完全可以自定义Request的,自定义Request自然要继承Request,那么本篇就教大家来一步一步地定义一个自己的Request类. ...

  9. log4cpp单例类封装

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

随机推荐

  1. Asp.Net Web API 2第一课——入门

    详情请查看http://aehyok.com/Blog/Detail/68.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链接:ht ...

  2. Html5 Canvas transform setTransform

    Html5 Canvas transform就是矩阵变换,一种坐标的变形. 坐标变形的三种方式,平移translate, 缩放scale以及旋转rotate都可以通过transform做到. tran ...

  3. [Hyper-V]在Windows 8.1 操作系统中启用Hyper-V功能

    描述: 如何在Windows 8.1 操作中启用Hyper-V功能 实现步骤: 1,安装Hyper-V 1 打开Control Panel,点击Progress 2 点击Turn Windows fe ...

  4. 使用Nito.AsyncEx实现异步锁

    Lock是常用的同步锁,但是我们无法在Lock的内部实现异步调用,比如我们无法使用await. 以下面的代码为例,当你在lock内部使用await时,VS会报错提醒. 最简单的解决办法就是使用第三方的 ...

  5. Hibernate.initialize(Obj)用法

    导读:  在使用hibernate进行持久化时,有时需要动态的改变对象的加载,比如在编辑页面里面lazy=true,而在浏览页面lazy=false,这样可以在需要lazy的地方才进行控制.而配置文件 ...

  6. 【VerySky原创】怎样查找到CDHDR、CDPOS表中的OBJECTCLAS字段

    可以通过pooled table TCDOB - Objects for change document creation 找到对应的表的对象值: se38 run:  RSSCD1TS object ...

  7. Adafruit的树莓派教程第五课:使用控制电缆

    Adafruit的树莓派教程第五课:使用控制电缆 时间 2014-05-09 01:11:20 极客范 原文 http://www.geekfan.net/9095/ 主题 Raspberry PiM ...

  8. 转:主流数据恢复软件——EasyRecovery/Ashampoo Undeleter/Wise Data Recovery/Recuva/Undelete 360

    转自:Baidu 空间 2012-10-05 13:57 主流数据恢复软件——EasyRecovery/Ashampoo Undeleter/Wise Data Recovery/Recuva/Und ...

  9. c# 操作excel 替代方案

    一直使用excel com 接口进行excel 操作,最近一次因为权限折腾了个够呛,果断放弃,使用 NPOI FileStream file = new FileStream(url, FileMod ...

  10. StarUml:Exception EOleSysError in module StarUML.ex

    http://sourceforge.net/p/staruml/discussion/510442/thread/9fe12cac/ run as administrator.Works fine.