常用的Volley網絡請求方法:

一.Volley

Volley結合了AsyncHttpClient和Universal-Image-Loader的優點——簡化了http的使用 + 異步加載圖片的神奇能力。Android中的Http實現主要有HttpUrlConnection和HttpClient兩種,關於二者的選擇Google在Blog中表示推薦在薑餅小人(API level = 9)及以上的版本中使用Java的HttpUrlConnection而在之前的版本使用Apache的HttpClient,這在Volley這個框架中也有明確的體現。

其執行步驟如下:

1.獲取RequestQueue;
2.實例化一個Request;
3.將Request加入RequestQueue;
get請求:
//初始化一個請求隊列
  RequestQueue queue = Volley.newRequestQueue(this);
  String url ="http://www.google.com";
   
  //根據給定的URL新建一個請求
  StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
              new Response.Listener() {
      @Override
      public void onResponse(String response) {
         //在這裏操作UI組件是安全的,因爲響應返回時這個函數會被post到UI線程來執行
         // 在這裏盡情蹂躪響應的String。
     }
 }, new Response.ErrorListener() {
     @Override
     public void onErrorResponse(VolleyError error) {
         // 出錯了怎麼辦?涼拌!並且在這裏拌。
     }
});
// 把這個請求加入請求隊列
queue.add(stringRequest);

post請求:
//初始化一個請求隊列
RequestQueue queue = Volley.newRequestQueue(this);
String url ="http://www.google.com";
 
//根據給定的URL新建一個請求
StringRequest stringRequest = new StringRequest(Request.Method.POST, url,
   new Response.Listener() {
    @Override
    public void onResponse(String response) {
        // 在這裏處理請求得到的String類型的響應
   }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        // 在這裏進行出錯之後的處理
   }
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
 
Map<String, String> map = new HashMap<String, String>(); 
        map.put("params1", "value1"); 
        map.put("params2", "value2"); 
        return map
 };
// 把這個請求加入請求隊列
queue.add(stringRequest);
取消請求:

Request中有一個cancel()方法,調用這個就可以取消當前請求了,但是取消到哪一個層次就不一定了,但是Volley可以保證響應處理函數(就是onResponse()和onErroeResponse())不會被調用。還有一個一起取消多個請求,就是在發出請求前調用Request的setTag()方法爲每個請求加一個標籤,這個方法的參數是Object,所以我們可以使用任何類型作爲標籤。這樣就可以調用ReqiestQueue的cancelAll()函數取消一羣標籤了。比較常用的方法就是,將發出這個請求的Activity或者Fragment作爲標籤,並在onStop()中調用cancelAll()。

優化RequestQueue

   如果一個App需要頻繁的網絡通信的話,建立多個RequestQueue是件很奇怪的事兒(誰會因爲臨時有飛機要在海上起飛就去新建一艘航母呢,這得多有錢啊),所以Google推薦我們只實例化一個RequestQueue來應付頻繁的Http通信,當然,要保證隊列的壽命和App一樣長。如何實現呢?Google又說了,不推薦在App的Application.onCretae()方法中實例化一個RequestQueue(不過確實是個簡單的方法哈),最好是建立一個單例模式的類,並把所有我們需要用到的Volley的瓶瓶罐罐都放進去,這樣顯得更模塊化。下面就是示例代碼。這段代碼中最重要的就是RequestQueue要用Application的Context實例化,要不然就會隨着Activity的生命週期不停重建。

private static MySingleton mInstance;
    private RequestQueue mRequestQueue;
    private ImageLoader mImageLoader;
    private static Context mCtx;
    private MySingleton(Context context) {
        mCtx = context;
        mRequestQueue = getRequestQueue();
 
        mImageLoader = new ImageLoader(mRequestQueue,
                new ImageLoader.ImageCache() {
            private final LruCache<String, Bitmap>
                    cache = new LruCache<String, Bitmap>(20);
            @Override
            public Bitmap getBitmap(String url) {
                return cache.get(url);
            }
 
            @Override
            public void putBitmap(String url, Bitmap bitmap) {
                cache.put(url, bitmap);
            }
        });
    }
    public static synchronized MySingleton getInstance(Context context) {
        if (mInstance == null) {
            mInstance = new MySingleton(context);
        }
        return mInstance;
    }
 
    public RequestQueue getRequestQueue() {
        if (mRequestQueue == null) {
            // getApplicationContext()是關鍵, 它會避免
            // Activity或者BroadcastReceiver帶來的缺點.
            mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
        }
        return mRequestQueue;
    }
    public <T> void addToRequestQueue(Request<T> req) {
        getRequestQueue().add(req);
    }
    public ImageLoader getImageLoader() {
        return mImageLoader;
    }
}



圖片請求:

ImageRequest能夠處理單張圖片,返回bitmap。

singleImg=(ImageView)findViewById(R.id.volley_img_single_imgeview);  
        ImageRequest imgRequest=new ImageRequest(url, new Response.Listener<Bitmap>() {  
            @Override  
            public void onResponse(Bitmap arg0) {  
                // TODO Auto-generated method stub  
                singleImg.setImageBitmap(arg0);  
            }  
        }, 300, 200, Config.ARGB_8888, new ErrorListener(){  
            @Override  
            public void onErrorResponse(VolleyError arg0) {  
                // TODO Auto-generated method stub  
                  
            }             
        });  
        mRequestQueue.add(imgRequest);  

Volley提供了使用ImageLoader加載圖片的方法:

ImageLoader這個類需要一個Request的實例以及一個ImageCache的實例。不幸的是Volley沒有提供默認的實現。

RequestQueue mRequestQueue = Volley.newRequestQueue(this);  
        final LruCache<String, Bitmap> mImageCache = new LruCache<String, Bitmap>(  
                20);  
        ImageCache imageCache = new ImageCache() {  
            @Override  
            public void putBitmap(String key, Bitmap value) {  
                mImageCache.put(key, value);  
            }  
  
            @Override  
            public Bitmap getBitmap(String key) {  
                return mImageCache.get(key);  
            }  
        };  
        ImageLoader mImageLoader = new ImageLoader(mRequestQueue, imageCache);  
        // imageView是一個ImageView實例  
        // ImageLoader.getImageListener的第二個參數是默認的圖片resource id  
        // 第三個參數是請求失敗時候的資源id,可以指定爲0  
        ImageListener listener = ImageLoader  
                .getImageListener(imageView, android.R.drawable.ic_menu_rotate,  
                        android.R.drawable.ic_delete);  
        mImageLoader.get(url, listener); 



更多詳細的:

http://www.daxueit.com/article/4889-3.html

http://blog.csdn.net/xyz_lmn/article/details/12165391


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章