欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android開發(fā)中使用Volley庫發(fā)送HTTP請(qǐng)求的實(shí)例教程

 更新時(shí)間:2016年05月06日 15:18:45   投稿:goldensun  
這篇文章主要介紹了Android開發(fā)中使用Volley庫發(fā)送HTTP請(qǐng)求的實(shí)例教程,包括創(chuàng)建Volley單例的基本知識(shí)與取消Request請(qǐng)求的技巧等,需要的朋友可以參考下

Android Volley 是Google開發(fā)的一個(gè)網(wǎng)絡(luò)lib,可以讓你更加簡單并且快速的訪問網(wǎng)絡(luò)數(shù)據(jù)。Volley庫的網(wǎng)絡(luò)請(qǐng)求都是異步的,你不必?fù)?dān)心異步處理問題。
Volley的優(yōu)點(diǎn):

  • 請(qǐng)求隊(duì)列和請(qǐng)求優(yōu)先級(jí)
  • 請(qǐng)求Cache和內(nèi)存管理
  • 擴(kuò)展性性強(qiáng)
  • 可以取消請(qǐng)求

下載和編譯volley.jar
需要安裝git,ant,android sdk
clone代碼:

git clone https://android.googlesource.com/platform/frameworks/volley

編譯jar:

android update project -p . ant jar

添加volley.jar到你的項(xiàng)目中
不過已經(jīng)有人將volley的代碼放到github上了:
https://github.com/mcxiaoke/android-volley,你可以使用更加簡單的方式來使用volley:
Maven
format: jar

<dependency>
  <groupId>com.mcxiaoke.volley</groupId>
  <artifactId>library</artifactId>
  <version>1.0.6</version>
</dependency>

Gradle
format: jar

compile 'com.mcxiaoke.volley:library:1.0.6'

Volley工作原理圖

201656151349558.jpg (1428×802)

創(chuàng)建Volley 單例
使用volley時(shí),必須要?jiǎng)?chuàng)建一個(gè)請(qǐng)求隊(duì)列RequestQueue,使用請(qǐng)求隊(duì)列的最佳方式就是將它做成一個(gè)單例,整個(gè)app使用這么一個(gè)請(qǐng)求隊(duì)列。

public class AppController extends Application {

public static final String TAG = AppController.class
    .getSimpleName();

private RequestQueue mRequestQueue;
private ImageLoader mImageLoader;

private static AppController mInstance;

@Override
public void onCreate() {
  super.onCreate();
  mInstance = this;
}

public static synchronized AppController getInstance() {
  return mInstance;
}

public RequestQueue getRequestQueue() {
  if (mRequestQueue == null) {
    mRequestQueue = Volley.newRequestQueue(getApplicationContext());
  }

  return mRequestQueue;
}

public ImageLoader getImageLoader() {
  getRequestQueue();
  if (mImageLoader == null) {
    mImageLoader = new ImageLoader(this.mRequestQueue,
        new LruBitmapCache());
  }
  return this.mImageLoader;
}

public <T> void addToRequestQueue(Request<T> req, String tag) {
  // set the default tag if tag is empty
  req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
  getRequestQueue().add(req);
}

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

public void cancelPendingRequests(Object tag) {
  if (mRequestQueue != null) {
    mRequestQueue.cancelAll(tag);
  }
}
}

另外,你還需要一個(gè)Cache來存放請(qǐng)求的圖片:

public class LruBitmapCache extends LruCache<String, Bitmap> implement ImageCache {
  public static int getDefaultLruCacheSize() {
    final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
    final int cacheSize = maxMemory / 8;

    return cacheSize;
  }

  public LruBitmapCache() {
    this(getDefaultLruCacheSize());
  }

  public LruBitmapCache(int sizeInKiloBytes) {
    super(sizeInKiloBytes);
  }

  @Override
  protected int sizeOf(String key, Bitmap value) {
    return value.getRowBytes() * value.getHeight() / 1024;
  }

  @Override
  public Bitmap getBitmap(String url) {
    return get(url);
  }

  @Override
  public void putBitmap(String url, Bitmap bitmap) {
    put(url, bitmap);
  }
}

別忘記在AndroidManifest.xml文件中添加android.permission.INTERNET權(quán)限。

HTTP請(qǐng)求實(shí)例

  private Context mContext;
  private RequestQueue mRequestQueue;
  private StringRequest mStringRequest;

  // 利用Volley實(shí)現(xiàn)Post請(qǐng)求
  private void volley_post() {
    String url = "http://aplesson.com/wap/api/user.php?action=login";
    mContext = this;
    mRequestQueue = Volley.newRequestQueue(mContext);
    mStringRequest = new StringRequest(Method.POST, url,
        new Response.Listener<String>() {
          @Override
          public void onResponse(String response) {
            System.out.println("請(qǐng)求結(jié)果:" + response);
          }
        }, new Response.ErrorListener() {
          @Override
          public void onErrorResponse(VolleyError error) {
            System.out.println("請(qǐng)求錯(cuò)誤:" + error.toString());
          }
        }) {
      // 攜帶參數(shù)
      @Override
      protected HashMap<String, String> getParams()
          throws AuthFailureError {
        HashMap<String, String> hashMap = new HashMap<String, String>();
        hashMap.put("un", "852041173");
        hashMap.put("pw", "852041173abc");
        return hashMap;
      }

      // Volley請(qǐng)求類提供了一個(gè) getHeaders()的方法,重載這個(gè)方法可以自定義HTTP 的頭信息。(也可不實(shí)現(xiàn))
      public Map<String, String> getHeaders() throws AuthFailureError {
        HashMap<String, String> headers = new HashMap<String, String>();
        headers.put("Accept", "application/json");
        headers.put("Content-Type", "application/json; charset=UTF-8");
        return headers;
      }

    };

    mRequestQueue.add(mStringRequest);

  }

  private JsonObjectRequest mJsonObjectRequest;

  // 利用Volley實(shí)現(xiàn)Json數(shù)據(jù)請(qǐng)求
  private void volley_json() {
    mContext = this;
    String url = "http://aplesson.com/data/101010100.html";
    // 1 創(chuàng)建RequestQueue對(duì)象
    mRequestQueue = Volley.newRequestQueue(mContext);
    // 2 創(chuàng)建JsonObjectRequest對(duì)象
    mJsonObjectRequest = new JsonObjectRequest(url, null,
        new Response.Listener<JSONObject>() {
          @Override
          public void onResponse(JSONObject response) {
            System.out.println("請(qǐng)求結(jié)果:" + response.toString());
          }
        }, new Response.ErrorListener() {
          @Override
          public void onErrorResponse(VolleyError error) {
            System.out.println("請(qǐng)求錯(cuò)誤:" + error.toString());
          }
        });

    // 3 將JsonObjectRequest添加到RequestQueue
    mRequestQueue.add(mJsonObjectRequest);

  }

  // 利用Volley實(shí)現(xiàn)Get請(qǐng)求
  private void volley_get() {
    mContext = this;
    String url = "http://www.aplesson.com/";
    // 1 創(chuàng)建RequestQueue對(duì)象
    mRequestQueue = Volley.newRequestQueue(mContext);
    // 2 創(chuàng)建StringRequest對(duì)象
    mStringRequest = new StringRequest(url,
        new Response.Listener<String>() {
          @Override
          public void onResponse(String response) {
            System.out.println("請(qǐng)求結(jié)果:" + response);
          }
        }, new Response.ErrorListener() {
          @Override
          public void onErrorResponse(VolleyError error) {
            System.out.println("請(qǐng)求錯(cuò)誤:" + error.toString());
          }
        });
    // 3 將StringRequest添加到RequestQueue
    mRequestQueue.add(mStringRequest);
  }


Volley提供了JsonObjectRequest、JsonArrayRequest、StringRequest等Request形式。JsonObjectRequest:返回JSON對(duì)象。
JsonArrayRequest:返回JsonArray。
StringRequest:返回String,這樣可以自己處理數(shù)據(jù),更加靈活。
另外可以繼承Request<T>自定義Request。

取消Request
Activity里面啟動(dòng)了網(wǎng)絡(luò)請(qǐng)求,而在這個(gè)網(wǎng)絡(luò)請(qǐng)求還沒返回結(jié)果的時(shí)候,Activity被結(jié)束了,此時(shí)如果繼續(xù)使用其中的Context等,除了無辜的浪費(fèi)CPU,電池,網(wǎng)絡(luò)等資源,有可能還會(huì)導(dǎo)致程序crash,所以,我們需要處理這種一場(chǎng)情況。使用Volley的話,我們可以在Activity停止的時(shí)候,同時(shí)取消所有或部分未完成的網(wǎng)絡(luò)請(qǐng)求。Volley里所有的請(qǐng)求結(jié)果會(huì)返回給主進(jìn)程,如果在主進(jìn)程里取消了某些請(qǐng)求,則這些請(qǐng)求將不會(huì)被返回給主線程。Volley支持多種request取消方式。
可以針對(duì)某些個(gè)request做取消操作:

 @Override
  public void onStop() {
    for (Request <?> req : mRequestQueue) {
      req.cancel();
    }
  }

取消這個(gè)隊(duì)列里的所有請(qǐng)求:

 @Override
  protected void onStop() {
    // TODO Auto-generated method stub
    super.onStop();
    mRequestQueue.cancelAll(this);
  }

可以根據(jù)RequestFilter或者Tag來終止某些請(qǐng)求

 @Override
  protected void onStop() {
    // TODO Auto-generated method stub
    super.onStop();

    mRequestQueue.cancelAll( new RequestFilter() {});
    or
    mRequestQueue.cancelAll(new Object());
  }

Volley支持http的GET、POST、PUT、DELETE等方法。


相關(guān)文章

最新評(píng)論