代碼示例
try{
URL url = new URL("http://www.google.com”)//定義地址
HttpURLConnection http = (HttpURLConnection) url.openConnection();//打開連接
int nRC = http.getResponseCode();//得到連接狀態
if(nRC == HttpURLConnection.HTTP_OK){
InputStream is = http.getInputStream();//取得數據
.....//處理數據
}
}catch(Exception e){
//因是連接網絡,不免會出現一些異常,所以必須處理這些異常
}finally{
//關閉流
}
請求參數
URL realUrl = new URL(requestUrl);
HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection
conn.setDoOutput(true);//設置容許輸出
conn.setUseCaches(false);//設置不使用緩存
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");//設置維持長連接
conn.setRequestProperty("Charset", "UTF-8");//設置文件字符集
conn.setRequestProperty("Content-Length", String.valueOf(data.length));//設置文件長度
conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
HttpURLConnection框架Volley
Volley使用
private RequestQueue mRequestQueue; //聲明一個新的RequestQueue對象
mRequestQueue = Volley.newRequestQueue(this); //在onCreate初始化mRequestQueue
JsonObjectRequest jr = new JsonObjectRequest(Request.Method.GET,url,null,new Response.Listener<JSONObject>() { //聲明並使用Request
@Override
public void onResponse(JSONObject response) {
parseJSON(response);
va.notifyDataSetChanged();
pd.dismiss();
}
},new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
mRequestQueue.add(jr);
/**Volley提供了JsonObjectRequest、JsonArrayRequest、StringRequest等Request形式。
JsonObjectRequest:返回JSON對象。
JsonArrayRequest:返回JsonArray。
StringRequest:返回String,這樣可以自己處理數據,更加靈活。
另外可以繼承Request<T>自定義Request。*/
取消Request
Activity停止的時候,同時取消所有或部分未完成的網絡請求,Volley裏所有的請求結果會返回給主進程,如果在主進程裏取消了某些請求,則這些請求將不會被返回給主線程
for (Request <?> req : mRequestQueue) { //針對某些個request做取消操作
req.cancel();
}
mRequestQueue.cancelAll(this); //取消這個隊列裏的所有請求
mRequestQueue.cancelAll( new RequestFilter() {}); //可以根據RequestFilter或者Tag來終止某些請求
or
mRequestQueue.cancelAll(new Object());
Volley支持http的GET、POST、PUT、DELETE等方法
使用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) {
}
});
mRequestQueue.add(imgRequest);
使用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);
使用NetworkImageView
public class NetworkImageView extends ImageView
繼承自ImageView,添加了一個
public void setImageUrl(String url, ImageLoader imageLoader) {}
方法,參數包含一個Url地址和一個ImageLoader對象
核心方法:
private void loadImageIfNecessary(final boolean isInLayoutPass) {}
內部實現,boolean 類型參數代表是否重新請求網絡 ,true:重新請求 false:取緩存
內部實現和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();
}
開始下載的默認圖和下載出錯後顯示圖。
public void setDefaultImageResId(int defaultImage) {
mDefaultImageId = defaultImage;
}
public void setErrorImageResId(int errorImage) {
mErrorImageId = errorImage;
}