android_HttpURLConnection

来源:互联网 发布:网络推广收费骗局 编辑:程序博客网 时间:2024/05/29 15:57
代码示例

    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;  

}  


0 0
原创粉丝点击