常用的Volley网络请求方法:

一.Volley

Volley结合了AsyncHttpClient和Universal-Image-Loader的优点——简化了http的使用 + 异步加载图片的神奇能力。Android中的Http实现主要有HttpUrlConnection和HttpClient两种,关于二者的选择Google在Blog中表示推荐在姜饼小人(API level = 9)及以上的版本中使用Java的HttpUrlConnection而在之前的版本使用Apache的HttpClient,这在Volley这个框架中也有明确的体现。

其执行步骤如下:

1.获取RequestQueue;
2.实例化一个Request;
3.将Request加入RequestQueue;
get请求:
//初始化一个请求队列
  RequestQueue queue = Volley.newRequestQueue(this);
  String url ="http://www.google.com";
   
  //根据给定的URL新建一个请求
  StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
              new Response.Listener() {
      @Override
      public void onResponse(String response) {
         //在这里操作UI组件是安全的,因为响应返回时这个函数会被post到UI线程来执行
         // 在这里尽情蹂躏响应的String。
     }
 }, new Response.ErrorListener() {
     @Override
     public void onErrorResponse(VolleyError error) {
         // 出错了怎么办?凉拌!并且在这里拌。
     }
});
// 把这个请求加入请求队列
queue.add(stringRequest);

post请求:
//初始化一个请求队列
RequestQueue queue = Volley.newRequestQueue(this);
String url ="http://www.google.com";
 
//根据给定的URL新建一个请求
StringRequest stringRequest = new StringRequest(Request.Method.POST, url,
   new Response.Listener() {
    @Override
    public void onResponse(String response) {
        // 在这里处理请求得到的String类型的响应
   }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        // 在这里进行出错之后的处理
   }
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
 
Map<String, String> map = new HashMap<String, String>(); 
        map.put("params1", "value1"); 
        map.put("params2", "value2"); 
        return map
 };
// 把这个请求加入请求队列
queue.add(stringRequest);
取消请求:

Request中有一个cancel()方法,调用这个就可以取消当前请求了,但是取消到哪一个层次就不一定了,但是Volley可以保证响应处理函数(就是onResponse()和onErroeResponse())不会被调用。还有一个一起取消多个请求,就是在发出请求前调用Request的setTag()方法为每个请求加一个标签,这个方法的参数是Object,所以我们可以使用任何类型作为标签。这样就可以调用ReqiestQueue的cancelAll()函数取消一群标签了。比较常用的方法就是,将发出这个请求的Activity或者Fragment作为标签,并在onStop()中调用cancelAll()。

优化RequestQueue

   如果一个App需要频繁的网络通信的话,建立多个RequestQueue是件很奇怪的事儿(谁会因为临时有飞机要在海上起飞就去新建一艘航母呢,这得多有钱啊),所以Google推荐我们只实例化一个RequestQueue来应付频繁的Http通信,当然,要保证队列的寿命和App一样长。如何实现呢?Google又说了,不推荐在App的Application.onCretae()方法中实例化一个RequestQueue(不过确实是个简单的方法哈),最好是建立一个单例模式的类,并把所有我们需要用到的Volley的瓶瓶罐罐都放进去,这样显得更模块化。下面就是示例代码。这段代码中最重要的就是RequestQueue要用Application的Context实例化,要不然就会随着Activity的生命周期不停重建。

private static MySingleton mInstance;
    private RequestQueue mRequestQueue;
    private ImageLoader mImageLoader;
    private static Context mCtx;
    private MySingleton(Context context) {
        mCtx = context;
        mRequestQueue = getRequestQueue();
 
        mImageLoader = new ImageLoader(mRequestQueue,
                new ImageLoader.ImageCache() {
            private final LruCache<String, Bitmap>
                    cache = new LruCache<String, Bitmap>(20);
            @Override
            public Bitmap getBitmap(String url) {
                return cache.get(url);
            }
 
            @Override
            public void putBitmap(String url, Bitmap bitmap) {
                cache.put(url, bitmap);
            }
        });
    }
    public static synchronized MySingleton getInstance(Context context) {
        if (mInstance == null) {
            mInstance = new MySingleton(context);
        }
        return mInstance;
    }
 
    public RequestQueue getRequestQueue() {
        if (mRequestQueue == null) {
            // getApplicationContext()是关键, 它会避免
            // Activity或者BroadcastReceiver带来的缺点.
            mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
        }
        return mRequestQueue;
    }
    public <T> void addToRequestQueue(Request<T> req) {
        getRequestQueue().add(req);
    }
    public ImageLoader getImageLoader() {
        return mImageLoader;
    }
}



图片请求:

ImageRequest能够处理单张图片,返回bitmap。

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);  

Volley提供了使用ImageLoader加载图片的方法:

ImageLoader这个类需要一个Request的实例以及一个ImageCache的实例。不幸的是Volley没有提供默认的实现。

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); 



更多详细的:

http://www.daxueit.com/article/4889-3.html

http://blog.csdn.net/xyz_lmn/article/details/12165391


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值