Android开源:网络框架volley使用

标签:
原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处 、作者信息和本声明。否则将追究法律责任。 http://glblong.blog.51cto.com/3058613/1406758

1.Get方法获取字符串:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
     public  void  loadGetJson(String url)
     {
         //创建RequestQueue对象,一个activity创建一个对象即可
         RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
         //创建get方法的json请求对象
         StringRequest sr =  new  StringRequest(url,  new  Listener<String>()
         {
             @Override
             public  void  onResponse(String response)
             {
                 Log.e( "onResponse" ""  + response);
             }
         },  new  ErrorListener()
         {
             @Override
             public  void  onErrorResponse(VolleyError error)
             {
                 Log.e( "onErrorResponse" ""  + error.toString());
             }
         });
         //将请求对象加入到请求队列里
         mQueue.add(sr);
     }



2.指定get或者post方法获取字符串

(1)get方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
RequestQueue requestQueue = Volley.newRequestQueue( this );
                 StringRequest sRequest= new  StringRequest(Request.Method.GET,CITY_CODE_URL,  new  Listener<String>() {
                         @Override
                         public  void  onResponse(String response) {
                                 System.out.println(response);                               
                         }
                 },  new  Response.ErrorListener() {
                         @Override
                         public  void  onErrorResponse(VolleyError arg0) {
                                 System.out.println( "sorry,Error" );
                         }
                 });
                 sRequest.setShouldCache( false );
                 requestQueue.add(sRequest);


(2)post方法

StringRequest中并没有提供设置POST参数的方法,但是当发出POST请求的时候,Volley会尝试调用StringRequest的父类——Request中的getParams()方法来获取POST参数,那么解决方法自然也就有了,我们只需要在StringRequest的匿名类中重写getParams()方法,在这里设置POST参数就可以了,代码如下所示:

1
2
3
4
5
6
7
8
9
StringRequest stringRequest =  new  StringRequest(Method.POST, url,  listener, errorListener) {
     @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;
     }
};


完整范例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
     public  void  loadPostLogin(String url)
     {
         RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
         StringRequest sr =  new  StringRequest(Request.Method.POST, url,  new  Listener<String>()
         {
             @Override
             public  void  onResponse(String response)
             {
                 Log.e( "onResponse" ""  + response);
             }
         },  new  ErrorListener()
         {
             @Override
             public  void  onErrorResponse(VolleyError error)
             {
                 Log.e( "onErrorResponse" ""  + error.toString());
             }
         })
         {
             @Override
             protected  Map<String, String> getParams()  throws  AuthFailureError
             {
                 Map<String, String> map =  new  HashMap<String, String>();  
                 map.put( "UserName" "glblong" );  
                 map.put( "PassWord" "123456" ); 
                 return  map;
             }
         };
         mQueue.add(sr);
     }


3.JsonObjectRequest和JsonArrayRequest用法与StringRequest一致,方法如下:

第二个参数说明:

Constructor which defaults to GET if jsonRequest is null, POST otherwise.

默认情况下设成null为get方法,否则为post方法。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
         JsonObjectRequest jsonObjectRequest =  new  JsonObjectRequest(url,  null new  Response.Listener<JSONObject>()
         {
             @Override
             public  void  onResponse(JSONObject response)
             {
                 Log.d( "TAG" , response.toString());
             }
         },  new  Response.ErrorListener()
         {
             @Override
             public  void  onErrorResponse(VolleyError error)
             {
                 Log.e( "TAG" , error.getMessage(), error);
             }
         });


4.ImageRequest用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
     /**
      * 第三第四个参数分别用于指定允许图片最大的宽度和高度,如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩,
      * 指定成0的话就表示不管图片有多大,都不会进行压缩。
     
      * @param url
      *            图片地址
      * @param listener
      * @param maxWidth
      *            指定允许图片最大的宽度
      * @param maxHeight
      *            指定允许图片最大的高度
      * @param decodeConfig
      *            指定图片的颜色属性,Bitmap.Config下的几个常量.
      * @param errorListener
      */
     public  void  getImgRequest( final  ImageView iv, String url)
     {
         RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
         ImageRequest ir =  new  ImageRequest(url,  new  Listener<Bitmap>()
         {
             public  void  onResponse(Bitmap response)
             {
                 iv.setImageBitmap(response);
             };
         },  0 0 , Config.RGB_565,  new  ErrorListener()
         {
             @Override
             public  void  onErrorResponse(VolleyError error)
             {
                 // TODO Auto-generated method stub
                 
             }
         });
         queue.add(ir);
     }


5. ImageLoader用法

ImageLoader比ImageRequest更加高效,因为它不仅对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
         //1.创建RequestQueue实例
         RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
         //2.创建ImageLoader实例,ImageCache需要重写才能实现缓存
         ImageLoader il =  new  ImageLoader(queue,  new  ImageCache()
         {
             @Override
             public  void  putBitmap(String url, Bitmap bitmap)
             {
                 // TODO Auto-generated method stub
             }
             @Override
             public  Bitmap getBitmap(String url)
             {
                 // TODO Auto-generated method stub
                 return  null ;
             }
         });
         //3.创建ImageListener实例,设置默认图片和加载失败图片
         ImageListener listener = ImageLoader.getImageListener(iv, R.drawable.img_loading, R.drawable.img_failed);
         //4.通过get方法加载图片
         il.get(url, listener);


使用范例代码如下:

(1)先实现ImageCache接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import  android.graphics.Bitmap;
import  android.support.v4.util.LruCache;
 
import  com.android.volley.toolbox.ImageLoader.ImageCache;
 
public  class  ImageLoaderCache  implements  ImageCache
{
     private  LruCache<String, Bitmap> mCache;
     
     public  ImageLoaderCache()
     {
         int  maxSize =  10  1024  1024 ; //设置缓存图片的大小为10M
         mCache =  new  LruCache<String, Bitmap>(maxSize)
         {
             @Override
             protected  int  sizeOf(String key, Bitmap bitmap)
             {
                 return  bitmap.getRowBytes() * bitmap.getHeight();
             }
         };
     }
     
     @Override
     public  Bitmap getBitmap(String url)
     {
         return  mCache.get(url);
     }
     
     @Override
     public  void  putBitmap(String url, Bitmap bitmap)
     {
         mCache.put(url, bitmap);
     }
}


(2)使用方法如下:

1
2
3
4
5
6
7
8
     public  void  getImgLoader(ImageView iv,String url)
     {
         RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
         ImageLoader il =  new  ImageLoader(queue,  new  ImageLoaderCache());
         ImageListener listener = ImageLoader.getImageListener(iv, R.drawable.img_loading, R.drawable.img_failed);
         //加载并限定图片宽度和高度
         il.get(url, listener,  200 300 );
     }


6.NetworkImageView的用法

NetworkImageView在加载图片的时候会自动获取自身控件的宽高,然后对比网络图片的宽度,再决定是否需要对图片进行压缩。也就是说,压缩过程是在内部完全自动化的,并不需要我们关心,NetworkImageView会始终呈现给我们一张大小刚刚好的网络图片,不会多占用任何一点内存。


如果不想对图片进行压缩的话,只需要在布局文件中把NetworkImageView的layout_width和layout_height都设置成wrap_content就可以了,这样NetworkImageView就会将该图片的原始大小展示出来,不会进行任何压缩。


(1)布局文件中添加NetworkImageView控件

1
2
3
4
5
6
7
     <com.android.volley.toolbox.NetworkImageView
         android:id= "@+id/networkImageView1"
         android:layout_width= "120dp"
         android:layout_height= "120dp"
         android:layout_centerHorizontal= "true"
         android:layout_marginTop= "60dp"
         android:src= "@drawable/ic_launcher"  />

2.代码实现

1
2
3
4
5
6
7
8
         RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
         ImageLoader imageLoader =  new  ImageLoader(queue,  new  ImageLoaderCache());
         
         NetworkImageView niv = (NetworkImageView) findViewById(R.id.networkImageView1);
         
         niv.setDefaultImageResId(R.drawable.img_loading);
         niv.setErrorImageResId(R.drawable.img_failed);
         niv.setImageUrl(url, imageLoader);


7.取消请求

Volley提供了强大的API取消未处理或正在处理的请求。取消请求最简单的方法是调用请求队列cancelAll(tag)的方法,前提是你在添加请求时设置了标记。这样就能使标签标记的请求挂起。


给请求设置标签:

1
request.setTag( "My Tag" );


使用ApplicationController添加使用了标签的请求到队列中:

1
ApplicationController.getInstance().addToRequestQueue(request,  "My Tag" );


取消所有指定标记的请求:

1
mRequestQueue.cancelAll( "My Tag" );






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值