1. 程式人生 > >Volley框架的使用

Volley框架的使用

Volley框架:
volley的特性:volley適合快速,簡單的請求(Json物件,圖片載入)
1.JSON,影象等的非同步下載;
2.網路請求的排序(scheduling)
3.網路請求的優先順序處理
4.快取
5.多級別取消請求
6.和Activity和生命週期的聯動(Activity結束時同時取消所有網路請求)


1.StringRequest
   載入網路資料的步驟

   --首先建立請求佇列(RequestQueue)(RequestQueue只需要一個例項即可,不像AsyncTask每次使用都要new一個)
// 初始化RequestQueue一個activity只需要一個 
RequestQueue mQueue=null;
   private void initRequestQueue() {  
       mQueue = Volley.newRequestQueue(getApplicationContext());  
    }  
----------------------------------------------
   --建立請求物件(StringRequest)
StringRequest request=null;
String cityname;
try {
cityname = URLEncoder.encode("北京", "utf8");
String path="http://op.juhe.cn/onebox/weather/query?cityname="+cityname+"&dtype=&key=ea8441cb939845649b04948972f34db6";
//建立一個請求物件
request=new StringRequest(path, new Listener<String>() {
@Override
public void onResponse(String response) {
Gson gson=new Gson();
WeatherEntity entity=gson.fromJson(response, WeatherEntity.class);
Log.i("Tag", entity.toString());
}
},  new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.i("Tag", error.getMessage());

}
});
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
------------------------------------------------------
   --把網路請求的物件加求請求佇列發出請求
queue.add(request);
---------------------------------------------------
      --成功響應獲得String  
public void onResponse(String response) {
Gson gson=new Gson();
WeatherEntity entity=gson.fromJson(response, WeatherEntity.class);
Log.i("Tag", entity.toString());
}
      --失敗獲得VolleyError
public void onErrorResponse(VolleyError error) {
Log.i("Tag", error.getMessage());

}
如果需要:
 // 重寫parseNetworkResponse方法改變返回頭引數解決亂碼問題  
        // 主要是看伺服器編碼,如果伺服器編碼不是UTF-8的話那麼就需要自己轉換,反之則不需要  
StringRequest srReq = new StringRequest(Request.Method.GET, url,  
            new StrListener(), new StrErrListener()) {  
  
        protected final String TYPE_UTF8_CHARSET = "charset=UTF-8";  
  
        // 重寫parseNetworkResponse方法改變返回頭引數解決亂碼問題  
        // 主要是看伺服器編碼,如果伺服器編碼不是UTF-8的話那麼就需要自己轉換,反之則不需要  
        @Override  
        protected Response<String> parseNetworkResponse(  
                NetworkResponse response) {  
            try {  
                String type = response.headers.get(HTTP.CONTENT_TYPE);  
                if (type == null) {  
                    type = TYPE_UTF8_CHARSET;  
                    response.headers.put(HTTP.CONTENT_TYPE, type);  
                } else if (!type.contains("UTF-8")) {  
                    type += ";" + TYPE_UTF8_CHARSET;  
                    response.headers.put(HTTP.CONTENT_TYPE, type);  
                }  
            } catch (Exception e) {  
            }  
            return super.parseNetworkResponse(response);  
        }  
    };  
request.setShouldCache(true);//控制是否快取
-----------------------------------------------------
2.Volley圖片的處理方式


   --ImageRequest
=======
 @param url 
 *            圖片地址 
 * @param listener 
 * @param maxWidth 
*            指定允許圖片最大的寬度 
 * @param maxHeight 
*            指定允許圖片最大的高度 
* @param decodeConfig 
*            指定圖片的顏色屬性,Bitmap.Config下的幾個常量. 
* @param errorListener 
      --少量圖片載入不需快取處理會對獲得的圖片進行壓縮處理


RequestQueue queue=Volley.newRequestQueue(this);
---------------------------------------------------
String url="http://172.60.25.9:8080/MusicServer/images/pingfanzhilu.jpg";
ImageRequest request=new ImageRequest(url, new Listener<Bitmap>() {

@Override
public void onResponse(Bitmap response) {
iamge.setImageBitmap(response);
}
}, 0, 0, Config.ARGB_8888,new ErrorListener() {


@Override
public void onErrorResponse(VolleyError error) {
Log.i("Tag", error.getMessage());
}
});
--------------------
queue.add(request);
===================
   --ImageLoader
      --具有本地快取功能的圖片載入器,快取空間需要自定義
課堂案例:
--------------
public class ImageLoaderActivity extends Activity {
ImageView imageView_loader=null;
RequestQueue queue=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image_loader);
imageView_loader=(ImageView) findViewById(R.id.imageView_loader);
queue=Volley.newRequestQueue(this);
}
public void imageloader(View view){
ImageLoader loader=new ImageLoader(queue, new ImageCache() {
int maxSize=1024*1024*4;
LruCache<String, Bitmap> cache=new LruCache<String, Bitmap>(maxSize){
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes()*value.getHeight();
};
};
@Override
public void putBitmap(String url, Bitmap bitmap) {
//把載入成功的圖片存入快取
cache.put(url, bitmap);
}

@Override
public Bitmap getBitmap(String url) {
//從快取中獲得圖片
return cache.get(url);
}
});
String url="http://172.60.50.50:8080/MusicServer/images/disanji.jpg";

ImageListener listener=ImageLoader.getImageListener(
imageView_loader,
R.drawable.ic_launcher,
R.drawable.ic_launcher);

loader.get(url, listener);
}


}
=========
=========
應用例項
----------------------------------------------
public class ImageAdapter extends ArrayAdapter<String> {  
      
    private RequestQueue mQueue;  
   private ImageLoader mImageLoader;  
  
   public ImageAdapter(Context context, List<String> objects) {  
       super(context, 0, objects);  
       mQueue = Volley.newRequestQueue(getContext());  
       mImageLoader = new ImageLoader(mQueue, new BitmapCache());  
   }  
      
   @Override  
   public View getView(int position, View convertView, ViewGroup parent) {  
       String url = getItem(position);  
       ImageView imageView;  
       if (convertView == null) {  
           imageView = new ImageView(getContext());  
       } else {  
           imageView = (ImageView) convertView;  
       }  
       // getImageListener(imageView控制元件物件,預設圖片地址,失敗圖片地址);  
       ImageListener listener = ImageLoader.getImageListener(imageView, android.R.drawable.ic_menu_rotate, android.R.drawable.ic_delete);  
       // get(圖片地址,listener,寬,高);自動幫你處理圖片的寬高再也不怕大圖片的oom了  
       mImageLoader.get(url, listener,100,200);  
       return imageView;  
   }  
}  
--------------還需重寫ImageCache這個類


public class <span style="font-family: Arial;">BitmapCache</span><span style="font-family: Arial;"> extends LruCache<String, Bitmap> implements ImageCache {</span>  
   // LruCache 原理:Cache儲存一個強引用來限制內容數量,每當Item被訪問的時候,此Item就會移動到佇列的頭部。 當cache已滿的時候加入新的item時,在佇列尾部的item會被回收。  
    // 解釋:當超出指定記憶體值則移除最近最少用的圖片記憶體  
   public static int getDefaultLruCacheSize() {  
       // 拿到最大記憶體  
       final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);  
       // 拿到記憶體的八分之一來做圖片記憶體快取  
       final int cacheSize = maxMemory / 8;  
  
       return cacheSize;  
   }  
  
   public BitmapLruCache() {  
       this(getDefaultLruCacheSize());  
   }  
 
   public BitmapLruCache(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);  
    }  
}  


   --NetWorkImageView
載入圖片的控制元件com.android.volley.NetworkImageView
這個控制元件在被從父控制元件detach的時候,會自動取消網路請求的,即完全不用我們擔心相關網路請求的生命週期問題,而且NetworkImageView還會根據你對圖片設定的width和heigh自動壓縮該圖片不會產生多的記憶體,還有NetworkImageView在列表中使用不會圖片錯誤)
-----
使用
----
<com.android.volley.toolbox.NetworkImageView  
   android:id="@+id/network_image_view"  
   android:layout_width="100dp"  
   android:layout_height="100dp" /> 
      --Volley框架定義圖片控制具有載入並快取圖片的能力
------
課堂案例:
-----
public class NetWorkImageActivity extends Activity {


NetworkImageView imageView=null;
RequestQueue queue=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_net_work_image);
imageView=(NetworkImageView) findViewById(R.id.imageview_network);

queue=Volley.newRequestQueue(this);
imageView.setDefaultImageResId(R.drawable.ic_launcher);
imageView.setErrorImageResId(R.drawable.ic_launcher);
}
public void loadnetwork(View view){
ImageLoader loader=new ImageLoader(queue, new ImageCache() {
int maxSize=1024*1024*4;
LruCache<String, Bitmap> cache=new LruCache<String, Bitmap>(maxSize){
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes()*value.getHeight();
};
};
@Override
public void putBitmap(String url, Bitmap bitmap) {
cache.put(url, bitmap);
}

@Override
public Bitmap getBitmap(String url) {
return cache.get(url);
}
});
String url="http://172.60.50.50:8080/MusicServer/images/disanji.jpg";
imageView.setImageUrl(url, loader);
}


}
----------
3.JsonRequest
------
課堂案例:
public class BlankActivity extends Activity {
RequestQueue queue=null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_blank);
queue=Volley.newRequestQueue(this);
}
public void onclick(View v){
JsonRequest<JSONObject> jsonRequest = null;
try {
String cityname = URLEncoder.encode("北京", "utf8");
String path = "http://op.juhe.cn/onebox/weather/query?cityname=" + cityname
+ "&dtype=&key=ea8441cb939845649b04948972f34db6";
jsonRequest = new JsonObjectRequest(path, null, new Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.i("tag", response.toString());
}
}, new ErrorListener() {


@Override
public void onErrorResponse(VolleyError error) {
}
});
} catch (Exception e) {
}
queue.add(jsonRequest);
}
}
4.自定義Volley請求物件
   繼承Reqeust<T>父類