【Android】Volley作網絡請求的幾種用法

前言html

  最近在將本身寫的爛代碼重構,之前使用的網絡請求全是基於apache的HttpClient,簡單使用還好,使用多了發現重複代碼太多,並且每次使用都很繁瑣,所以在網上找了半天網絡請求的相關類庫,最後仍是肯定使用Volley,因而如今記個使用筆記:java

Volley幾個主要功能:android

1. 普通String請求:git

既然使用了網絡請求,那麼網絡權限是必不可少的,在AndroidManifest.xml中添加:github

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

  由於網絡請求有GET/POST兩種,這裏須要注意一下,調用Volley進行POST的時候提供的是getParams方法來存入鍵值對,因此這裏使用了String... strKV來代替HashMap;apache

代碼以下:網絡

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請求方式以下:ide

  // 調用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

請求結果如圖:post

 

 

2. Json請求:this

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

明天繼續補充,今天先到這兒吧

相關文章
相關標籤/搜索