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包:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值