• 【Android】Volley做网络请求的几种用法


    前言

      最近在将自己写的烂代码重构,以前使用的网络请求全是基于apache的HttpClient,简单使用还好,使用多了发现重复代码太多,而且每次使用都很繁琐,因此在网上找了半天网络请求的相关类库,最后还是确定使用Volley,于是现在记个使用笔记:

    Volley几个主要功能:

    1. 普通String请求:

    既然使用了网络请求,那么网络权限是必不可少的,在AndroidManifest.xml中添加:

    <uses-permission android:name="android.permission.INTERNET" />

      因为网络请求有GET/POST两种,这里需要注意一下,调用Volley进行POST的时候提供的是getParams方法来存入键值对,所以这里使用了String... strKV来代替HashMap;

    代码如下:

    package com.dreamyfly.volleyexample.utils;
    
    import com.android.volley.AuthFailureError;
    import com.android.volley.Request;
    import com.android.volley.Response;
    import com.android.volley.VolleyError;
    import com.android.volley.toolbox.StringRequest;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class HttpUtils {
        /**
         * 使用方法:
         * 1. 在相应的Activity中实现RequestQueue的实例化
         * 2. 实现对应的AsyncRequestable和Executable接口
         * 3. 填入get或者post的url,最后请求结果会返回在Executable的方法中
         * 4. 传入的参数以String... strKVs格式传入,例: “email”, "xxx@qq.com", "password", "123456"
         * 所以4中最后传入参数实际格式会变为: email=xxx@qq.com&password=123456
         */
        public static void doVolleyGet(AsyncRequestable qa, String getUrl,
                                       final Executable<String> execOnSuccess,
                                       final Executable<VolleyError> execOnError,
                                       final String... strKVs) {
            doVolleyRequest(Request.Method.GET, qa, getUrl, execOnSuccess, execOnError, strKVs);
        }
    
        public static void doVolleyPost(AsyncRequestable qa, String postUrl,
                                        final Executable<String> execOnSuccess,
                                        final Executable<VolleyError> execOnError,
                                        final String... strKVs) {
            doVolleyRequest(Request.Method.POST, qa, postUrl, execOnSuccess, execOnError, strKVs);
        }
    private static void doVolleyRequest(int requestMethod, AsyncRequestable qa, String requestUrl, final Executable<String> execOnSuccess, final Executable<VolleyError> execOnError, final String... strKVs) { StringRequest requestPost = new StringRequest(requestMethod, requestUrl, new Response.Listener<String>() { @Override public void onResponse(String resultStr) { if (execOnSuccess != null) execOnSuccess.execute(resultStr); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { if (execOnError != null) execOnError.execute(volleyError); } }) { @Override protected Map<String, String> getParams() throws AuthFailureError { HashMap<String, String> map = new HashMap<String, String>(); if (strKVs != null && (strKVs.length % 2 == 0)) { for (int i = 0; i < strKVs.length; i += 2) { map.put(strKVs[i], strKVs[i + 1]); } } return map; } }; // queueTag 用于调用cancelAll(queueTag)取消加入队列的请求 requestPost.setTag(qa.getQueueTag()); qa.getQueue().add(requestPost); } }

    使用GET请求方式如下:

      // 调用doVolleyGet实现GET请求
                    HttpUtils.doVolleyGet(new AsyncRequestable() {
                        @Override
                        public String getQueueTag() {
                            return null;
                        }
                        @Override
                        public RequestQueue getQueue() {
                            // 在此return mQueue以确保mQueue能够加入RequestQueue中
                            return mQueue;
                        }
                    }, METHOD_GET_URL, new Executable<String>() {
                        @Override
                        public void execute(String resultStr) {
                            // GET请求以String类型在此传出,并且可以实现UI操作,例如Toast
                            Toast.makeText(MainActivity.this, "GET Result: " + resultStr, Toast.LENGTH_SHORT).show();
                            requestResultTV.setText(String.valueOf(resultStr));
                        }
                    }, new Executable<VolleyError>() {
                        @Override
                        public void execute(VolleyError volleyError) {
                            // 如果访问失败,则打印Log
                            Log.e("VolleyError", volleyError.toString());
                        }
                    }); // StrKVs什么也不传的话参数就为null

    请求结果如图:

    2. Json请求:

    JSON请求的JSON接口我当前使用的是国家气象局的接口:http://www.weather.com.cn/adat/sk/101010100.html (网上随便找的,能用就行),如下图:

    {
      weatherinfo: {
      city: "北京",
      cityid: "101010100",
      temp: "10",
      WD: "东南风",
      WS: "2级",
      SD: "26%",
      WSE: "2",
      time: "10:25",
      isRadar: "1",
      Radar: "JC_RADAR_AZ9010_JB",
      njd: "暂无实况",
      qy: "1012"
      }
    }

    3. NetworkImageView加载Image:

    相关资源:

    1. 大神解析:guolin

    2. 源码:

      Github:https://github.com/eterrao/android-volley.git

        google:https://android.googlesource.com/platform/frameworks/volley

      CSDN下载jar包:

    明天继续补充,今天先到这儿吧

  • 相关阅读:
    WordPress错误:无法启用插件,因为它引起了一个致命错误
    快速使用 Thinkphp 之一: 准备工作-配置PHP环境及下载Thinkphp文件
    基于XML文件格式引用页面
    PHP清除html、css、js格式并去除空格的PHP函数
    本地无法启动MySQL服务,报的错误:1067,进程意外终止
    快速使用 Thinkphp 之二: 创建自己的应用项目
    HTML页面里加载flash文件源码
    【学习笔记】数据库 windrainpy
    【转】给年轻程序员的建议 windrainpy
    【转】js变量以及其作用域详解 windrainpy
  • 原文地址:https://www.cnblogs.com/raomengyang/p/5003883.html
Copyright © 2020-2023  润新知