Android开源:网络框架volley使用(一)---使用方法笔记

简介:

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





本文转自 glblong 51CTO博客,原文链接:http://blog.51cto.com/glblong/1406758,如需转载请自行联系原作者

目录
相关文章
|
28天前
|
SQL 缓存 安全
Android ORM 框架之 greenDAO
Android ORM 框架之 greenDAO
36 0
|
18天前
|
存储 分布式计算 监控
Hadoop【基础知识 01+02】【分布式文件系统HDFS设计原理+特点+存储原理】(部分图片来源于网络)【分布式计算框架MapReduce核心概念+编程模型+combiner&partitioner+词频统计案例解析与进阶+作业的生命周期】(图片来源于网络)
【4月更文挑战第3天】【分布式文件系统HDFS设计原理+特点+存储原理】(部分图片来源于网络)【分布式计算框架MapReduce核心概念+编程模型+combiner&partitioner+词频统计案例解析与进阶+作业的生命周期】(图片来源于网络)
69 2
|
28天前
|
编解码 开发工具 Android开发
Android获取设备各项信息(设备id、ip地址、设备名称、运行商、品牌、型号、分辨率、处理器、国家码、系统语言、网络类型、oaid、android版本、操作系统版本、mac地址、应用程序签名..)2
Android获取设备各项信息(设备id、ip地址、设备名称、运行商、品牌、型号、分辨率、处理器、国家码、系统语言、网络类型、oaid、android版本、操作系统版本、mac地址、应用程序签名..)2
27 2
|
6天前
|
移动开发 Java Android开发
构建高效Android应用:采用Kotlin协程优化网络请求
【4月更文挑战第24天】 在移动开发领域,尤其是对于Android平台而言,网络请求是一个不可或缺的功能。然而,随着用户对应用响应速度和稳定性要求的不断提高,传统的异步处理方式如回调地狱和RxJava已逐渐显示出局限性。本文将探讨如何利用Kotlin协程来简化异步代码,提升网络请求的效率和可读性。我们将深入分析协程的原理,并通过一个实际案例展示如何在Android应用中集成和优化网络请求。
|
7天前
|
存储 应用服务中间件 网络安全
Android 网络链接稳定性测试解决方案
Android 网络链接稳定性测试解决方案
17 0
|
14天前
|
Android开发 开发者
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
Android&#39;s AsyncTask simplifies asynchronous tasks for brief background work, bridging UI and worker threads. It involves execute() for starting tasks, doInBackground() for background execution, publishProgress() for progress updates, and onPostExecute() for returning results to the main thread.
11 0
|
14天前
|
网络协议 安全 API
Android网络和数据交互: 什么是HTTP和HTTPS?在Android中如何进行网络请求?
HTTP和HTTPS是网络数据传输协议,HTTP基于TCP/IP,简单快速,HTTPS则是加密的HTTP,确保数据安全。在Android中,过去常用HttpURLConnection和HttpClient,但HttpClient自Android 6.0起被移除。现在推荐使用支持TLS、流式上传下载、超时配置等特性的HttpsURLConnection进行网络请求。
11 0
|
17天前
|
JSON Kubernetes 网络架构
Kubernetes CNI 网络模型及常见开源组件
【4月更文挑战第13天】目前主流的容器网络模型是CoreOS 公司推出的 Container Network Interface(CNI)模型
|
18天前
|
网络协议 Java API
Python网络编程基础(Socket编程)Twisted框架简介
【4月更文挑战第12天】在网络编程的实践中,除了使用基本的Socket API之外,还有许多高级的网络编程库可以帮助我们更高效地构建复杂和健壮的网络应用。这些库通常提供了异步IO、事件驱动、协议实现等高级功能,使得开发者能够专注于业务逻辑的实现,而不用过多关注底层的网络细节。
|
18天前
|
分布式计算 监控 Hadoop
Hadoop【基础知识 02】【分布式计算框架MapReduce核心概念+编程模型+combiner&partitioner+词频统计案例解析与进阶+作业的生命周期】(图片来源于网络)
【4月更文挑战第3天】Hadoop【基础知识 02】【分布式计算框架MapReduce核心概念+编程模型+combiner&partitioner+词频统计案例解析与进阶+作业的生命周期】(图片来源于网络)
55 0