Volley的用法

为了使用Volley,你必须添加android.permission.INTERNET权限到你的manifest文件中。没有这个权限,你的app将无法访问网络。


使用Volley,一般为三步骤:

1. 创建一个RequestQueue对象。

2. 创建一个Request实现类对象。

3. 将Request实现类对象添加到RequestQueue里面。


Volley中Request的实现类默认有StringRequest,JsonObjectRequest,JsonArrayRequest,ImageRequest。就拿StringRequest来说:

rq = Volley.newRequestQueue(this);      //第一步,创建一个RequestQueue对象
        //第二步,创建一个StringRequest对象,下面为get请求方式
        StringRequest stringRequest = new StringRequest("http://www.baidu.com", new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                text.setText(response);
//                rq.stop();  //如果你仅仅是想做一个单次的请求并且不想要线程池一直保留,调用RequestQueue的stop方法。
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

            }
        });
        stringRequest.addMarker("baidu-look");  //添加stringRequest生命周期的观察
        stringRequest.setTag("baidu");
        rq.add(stringRequest);

//        stringRequest.cancel(); //请求取消,一般在activity的onstop中调用
//        rq.cancelAll("baidu");  //请求队列取消有baidu这个tag的请求,一般在activity的onstop中调用。
效果图:



一个RequestQueue需要两部分来支持它的工作:一部分是网络操作,用来传输请求,另外一个是用来处理缓存操作的Cache。在Volley的工具箱中包含了标准的实现方式:DiskBasedCache提供了每个文件与对应响应数据一一映射的缓存实现。 BasicNetwork提供了一个网络传输的实现,连接方式可以是AndroidHttpClient或者是 HttpURLConnection.

BasicNetwork是Volley默认的网络操作实现方式。一个BasicNetwork必须使用HTTP Client进行初始化。这个Client通常是AndroidHttpClient 或者 HttpURLConnection:

  • 对于app target API level低于API 9(Gingerbread)的使用AndroidHttpClient。在Gingerbread之前,HttpURLConnection是不可靠的。对于这个的细节,请参考Android's HTTP Clients
  • 对于API Level 9以及以上的,使用HttpURLConnection。

下面的代码片段演示了如何一步步建立一个RequestQueue:

RequestQueue mRequestQueue;

// Instantiate the cache
Cache cache = new DiskBasedCache(getCacheDir(), 1024 * 1024); // 1MB cap

// Set up the network to use HttpURLConnection as the HTTP client.
Network network = new BasicNetwork(new HurlStack());

// Instantiate the RequestQueue with the cache and network.
mRequestQueue = new RequestQueue(cache, network);

// Start the queue
mRequestQueue.start();
开启Request的生命周期观察,使用request. addMarker( )方法。并在命令行中:
  • $adb shell
  • $setprop log.tag.Volley VERBOSE
  • logcat
如上例中:
08-04 09:59:49.383    2478-2478/com.example.volleytest D/Volley﹕ [1] MarkerLog.finish: (2040 ms) [ ] http://www.baidu.com 0x101be397 NORMAL 1
08-04 09:59:49.383    2478-2478/com.example.volleytest D/Volley﹕ [1] MarkerLog.finish: (+0   ) [ 1] baidu-look
08-04 09:59:49.388    2478-2478/com.example.volleytest D/Volley﹕ [1] MarkerLog.finish: (+1   ) [ 1] add-to-queue
08-04 09:59:49.389    2478-2478/com.example.volleytest D/Volley﹕ [1] MarkerLog.finish: (+223 ) [1056] cache-queue-take
08-04 09:59:49.391    2478-2478/com.example.volleytest D/Volley﹕ [1] MarkerLog.finish: (+0   ) [1056] cache-miss
08-04 09:59:49.393    2478-2478/com.example.volleytest D/Volley﹕ [1] MarkerLog.finish: (+0   ) [1058] network-queue-take
08-04 09:59:49.395    2478-2478/com.example.volleytest D/Volley﹕ [1] MarkerLog.finish: (+93  ) [1058] network-http-complete
08-04 09:59:49.397    2478-2478/com.example.volleytest D/Volley﹕ [1] MarkerLog.finish: (+4   ) [1058] network-parse-complete
08-04 09:59:49.402    2478-2478/com.example.volleytest D/Volley﹕ [1] MarkerLog.finish: (+0   ) [1058] post-response
08-04 09:59:49.404    2478-2478/com.example.volleytest D/Volley﹕ [1] MarkerLog.finish: (+1719) [ 1] done
如果我们调用request.cancel()方法,也就是取消请求,其log输出:
08-04 10:22:25.067    3252-3252/com.example.volleytest D/Volley﹕ [1] MarkerLog.finish: (37   ms) com.android.volley.Request$1@41a88d10
08-04 10:22:25.069    3252-3252/com.example.volleytest D/Volley﹕ [1] MarkerLog.finish: (+0   ) [ 1] baidu-look
08-04 10:22:25.070    3252-3252/com.example.volleytest D/Volley﹕ [1] MarkerLog.finish: (+0   ) [ 1] add-to-queue
08-04 10:22:25.071    3252-3252/com.example.volleytest D/Volley﹕ [1] MarkerLog.finish: (+1   ) [1083] cache-queue-take
08-04 10:22:25.072    3252-3252/com.example.volleytest D/Volley﹕ [1] MarkerLog.finish: (+36  ) [1083] cache-discard-canceled

在开发中,我们一般定义一个全局的单例RequestQueue。一个关键的概念是RequestQueue必须和Application context所关联的。而不是Activity的context。这确保了RequestQueue在你的app生命周期中一直存活,而不会因为activity的重新创建而重新创建RequestQueue。(例如,当用户旋转设备时)。

public class MySingleton {
    private static MySingleton mInstance;
    private RequestQueue mRequestQueue;
    private static Context mCtx;

    private MySingleton(Context context) {
        mCtx = context;
        mRequestQueue = getRequestQueue();

    }

    public static synchronized MySingleton getInstance(Context context) {
        if (mInstance == null) {
            mInstance = new MySingleton(context);
        }
        return mInstance;
    }

    public RequestQueue getRequestQueue() {
        if (mRequestQueue == null) {
            // getApplicationContext() is key, it keeps you from leaking the
            // Activity or BroadcastReceiver if someone passes one in.
            mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
        }
        return mRequestQueue;
    }

    public <T> void addToRequestQueue(Request<T> req) {
        getRequestQueue().add(req);
    }


}


自定义Request:GsonRequest

public class GsonRequest<T> extends Request<T> {
    private final Gson gson = new Gson();
    private final Class<T> clazz;
    private final Map<String, String> headers = new HashMap<String, String>();
    private final Map<String,String> postParams = new HashMap<String, String>();
    private final Response.Listener<T> listener;

    /*
     * 设置访问自己服务器时必须传递的参数,密钥等
     */
    {
        headers.put("APP-Key", "LBS-AAA");
        headers.put("APP-Secret", "ad12msa234das232in");
    }

    /**
     * Make a GET request and return a parsed object from JSON.
     *
     * @param url URL of the request to make
     * @param clazz Relevant class object, for Gson's reflection
     * @param headers Map of request headers
     */
    public GsonRequest(int method,String url, Class<T> clazz, Map<String, String> headers,Map<String, String> postParams,
                       Response.Listener<T> listener, Response.ErrorListener errorListener) {
        super(method, url, errorListener);
        this.clazz = clazz;
        if(headers != null) {
            this.headers.putAll(headers);
        }
        if(postParams != null) {
            this.postParams.putAll(postParams);
        }
        this.listener = listener;
    }

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        String message = "";
        Iterator iter = headers.entrySet().iterator();
        while (iter.hasNext()) {
            Map.Entry entry = (Map.Entry) iter.next();
            String key = (String) entry.getKey();
            String val = (String) entry.getValue();
            message += key + "=" + val + "&";
        }
        if(headers.size() != 0){
            message = message.substring(0,message.length()-1);
        }
        L.d("Headers",message);
        return headers != null ? headers : super.getHeaders();
    }

    @Override
    protected Map<String, String> getParams() throws AuthFailureError {
        String message = "";
        Iterator iter = postParams.entrySet().iterator();
        while (iter.hasNext()) {
            Map.Entry entry = (Map.Entry) iter.next();
            String key = (String) entry.getKey();
            String val = (String) entry.getValue();
            message += key + "=" + val + "&";
        }
        if(postParams.size() != 0){
            message = message.substring(0,message.length()-1);
        }
        L.d("PostParams",message);
        return postParams != null ? postParams : super.getParams();
    }

    @Override
    protected void deliverResponse(T response) {
        listener.onResponse(response);
    }

    @Override
    protected Response<T> parseNetworkResponse(NetworkResponse response) {
        try {
            String json = new String(
                    response.data,
                    HttpHeaderParser.parseCharset(response.headers));
            return Response.success(
                    gson.fromJson(json, clazz),
                    HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        } catch (JsonSyntaxException e) {
            return Response.error(new ParseError(e));
        }
    }
}
主要就是重写parseNetworkResponse方法和deliverResponse方法。参照JsonObjectRequest来写。如果是post方式提交数据,就会调用getParams()来提交参数,getHeaders()方法是任何Request都会调用。getParams()和getHeaders()加log是方便排错。

Activity中代码:

 rq = Volley.newRequestQueue(this);

        HashMap<String,String> postParams = new HashMap<String, String>();
        postParams.put("param1","value1");
        postParams.put("param2", "value2");
        GsonRequest<User> gsonRequest = new GsonRequest<User>(Request.Method.POST,
                "http://192.168.1.100:8080/demo/WeatherServlet", User.class,
               null ,postParams , new Response.Listener<User>() {
            @Override
            public void onResponse(User response) {
                text.setText(response.getName());
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                text.setText(error.getMessage());
            }
        });
        gsonRequest.addMarker("gson-request");
        gsonRequest.setShouldCache(false);  //不缓存
        rq.add(gsonRequest);

服务器中的Servlet代码:

public class WeatherServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public WeatherServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String json = "{'name':'kedou','password':'123456'}";
		
		response.setContentType("text/plain;charset=utf-8");
		response.getWriter().write(json);;
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}
这里仅仅只是输出一个json的字符串。

activity中是post方式提交,log信息:

08-04 15:55:17.141  12816-12841/com.example.volleytest D/Headers﹕ APP-Secret=ad12msa234das232in&APP-Key=LBS-AAA
08-04 15:55:17.143  12816-12841/com.example.volleytest D/PostParams﹕ param1=value1&param2=value2

如果是get方式提交只会有Headers信息。




参考:1. Android Volley完全解析(四),带你从源码的角度理解Volley

2.使用Volley传输网络数据

3.https://github.com/smanikandan14/Volley-demo中的说明


源码:http://yunpan.cn/cdjDJcINpnzXq (提取码:17bc)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值