前一篇粗略的介紹了一下Volley,並在最後附上了一段使用代碼,這一篇詳細的介紹一下Volley的使用。前面也說了Volley主要獲取JSON對象和圖片加載,這裏也分爲兩部分介紹。
1、獲取JSON對象
1.1聲明RequestQueue
- private RequestQueue mRequestQueue;
- mRequestQueue = Volley.newRequestQueue(this);
1.2 聲明並使用Request
- JsonObjectRequest jr = new JsonObjectRequest(Request.Method.GET,url,null,new Response.Listener<JSONObject>() {
- @Override
- public void onResponse(JSONObject response) {
- Log.i(TAG,response.toString());
- parseJSON(response);
- va.notifyDataSetChanged();
- pd.dismiss();
- }
- },new Response.ErrorListener() {
- @Override
- public void onErrorResponse(VolleyError error) {
- Log.i(TAG,error.getMessage());
- }
- });
- mRequestQueue.add(jr);
JsonObjectRequest:返回JSON對象。
JsonArrayRequest:返回JsonArray。
StringRequest:返回String,這樣可以自己處理數據,更加靈活。
另外可以繼承Request<T>自定義Request。
1.3 取消Request
1)可以針對某些個request做取消操作:
- @Override
- public void onStop() {
- for (Request <?> req : mRequestQueue) {
- req.cancel();
- }
- }
- @Override
- protected void onStop() {
- // TODO Auto-generated method stub
- super.onStop();
- mRequestQueue.cancelAll(this);
- }
3)可以根據RequestFilter或者Tag來終止某些請求
- @Override
- rotected void onStop() {
- // TODO Auto-generated method stub
- super.onStop();
- mRequestQueue.cancelAll( new RequestFilter() {});
- or
- mRequestQueue.cancelAll(new Object());
2、圖片加載
2.1使用ImageRequest下載圖片
- 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);
2.2使用ImageLoader
ImageLoader這個類需要一個Request的實例以及一個ImageCache的實例。圖片通過一個URL和一個ImageListener實例的get()方法就可以被加載。從哪裏,ImageLoader會檢查ImageCache,而且如果緩存裏沒有圖片就會從網絡上獲取。
Volley的ImageCache接口允許你使用你喜歡的L1緩存實現。不幸的是Volley沒有提供默認的實現。在I/O的介紹中展示了BitmapLruCache的一點代碼片段,但是Volley這個庫本身並不包含任何相關的實現。
ImageCache接口有兩個方法,getBitmap(String url)和putBitmap(String
url, Bitmap bitmap).這兩個方法足夠簡單直白,他們可以添加任何的緩存實現。
- 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);
2.3 使用NetworkImageView
- public class NetworkImageView extends ImageView
- public void setImageUrl(String url, ImageLoader imageLoader) {}
核心方法:
- private void loadImageIfNecessary(final boolean isInLayoutPass) {}
內部實現和ImageLoader類似,都是通過ImageContainer中new一個ImageListener,在ImageListener,只是做了Url的空判斷,如果Url爲null,則調用ImageContainer.cancelRequest();取消請求。
覆寫方法:
- @Override
- protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
- super.onLayout(changed, left, top, right, bottom);
- //onLayout時重新請求
- loadImageIfNecessary(true);
- }
- @Override
- protected void onDetachedFromWindow() {
- //銷燬View的時候Release操作
- if (mImageContainer != null) {
- // If the view was bound to an image request, cancel it and clear
- // out the image from the view.
- mImageContainer.cancelRequest();
- setImageBitmap(null);
- // also clear out the container so we can reload the image if necessary.
- mImageContainer = null;
- }
- super.onDetachedFromWindow();
- }
- //drawable狀態改變重繪
- @Override
- protected void drawableStateChanged() {
- super.drawableStateChanged();
- invalidate();
- }
總結:網絡請求下載圖片顯示,可以使用此控件,比傳統的ImageView多了網絡處理,也添加了2個方法,設置開始下載的默認圖和下載出錯後顯示圖。
- /**
- * Sets the default image resource ID to be used for this view until the attempt to load it
- * completes.
- */
- public void setDefaultImageResId(int defaultImage) {
- mDefaultImageId = defaultImage;
- }
- /**
- * Sets the error image resource ID to be used for this view in the event that the image
- * requested fails to load.
- */
- public void setErrorImageResId(int errorImage) {
- mErrorImageId = errorImage;
- }