android_HttpURLConnection

代碼示例

    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;  

}  


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