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,如需转载请自行联系原作者

目录
相关文章
|
27天前
|
Linux 开发工具 Android开发
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
ijkplayer是由Bilibili基于FFmpeg3.4研发并开源的播放器,适用于Android和iOS,支持本地视频及网络流媒体播放。本文详细介绍如何在新版Android Studio中导入并使用ijkplayer库,包括Gradle版本及配置更新、导入编译好的so文件以及添加直播链接播放代码等步骤,帮助开发者顺利进行App调试与开发。更多FFmpeg开发知识可参考《FFmpeg开发实战:从零基础到短视频上线》。
102 2
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
|
16天前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
60 6
|
1月前
|
机器学习/深度学习 数据可视化 计算机视觉
目标检测笔记(五):详细介绍并实现可视化深度学习中每层特征层的网络训练情况
这篇文章详细介绍了如何通过可视化深度学习中每层特征层来理解网络的内部运作,并使用ResNet系列网络作为例子,展示了如何在训练过程中加入代码来绘制和保存特征图。
56 1
目标检测笔记(五):详细介绍并实现可视化深度学习中每层特征层的网络训练情况
|
24天前
|
机器学习/深度学习 人工智能
类人神经网络再进一步!DeepMind最新50页论文提出AligNet框架:用层次化视觉概念对齐人类
【10月更文挑战第18天】这篇论文提出了一种名为AligNet的框架,旨在通过将人类知识注入神经网络来解决其与人类认知的不匹配问题。AligNet通过训练教师模型模仿人类判断,并将人类化的结构和知识转移至预训练的视觉模型中,从而提高模型在多种任务上的泛化能力和稳健性。实验结果表明,人类对齐的模型在相似性任务和出分布情况下表现更佳。
55 3
|
1月前
|
机器学习/深度学习 数据可视化 Windows
深度学习笔记(七):如何用Mxnet来将神经网络可视化
这篇文章介绍了如何使用Mxnet框架来实现神经网络的可视化,包括环境依赖的安装、具体的代码实现以及运行结果的展示。
50 0
|
9天前
|
存储 安全 网络安全
网络安全法律框架:全球视角下的合规性分析
网络安全法律框架:全球视角下的合规性分析
22 1
|
1月前
|
机器学习/深度学习 编解码 算法
轻量级网络论文精度笔记(三):《Searching for MobileNetV3》
MobileNetV3是谷歌为移动设备优化的神经网络模型,通过神经架构搜索和新设计计算块提升效率和精度。它引入了h-swish激活函数和高效的分割解码器LR-ASPP,实现了移动端分类、检测和分割的最新SOTA成果。大模型在ImageNet分类上比MobileNetV2更准确,延迟降低20%;小模型准确度提升,延迟相当。
56 1
轻量级网络论文精度笔记(三):《Searching for MobileNetV3》
|
1月前
|
机器学习/深度学习 网络架构 计算机视觉
目标检测笔记(一):不同模型的网络架构介绍和代码
这篇文章介绍了ShuffleNetV2网络架构及其代码实现,包括模型结构、代码细节和不同版本的模型。ShuffleNetV2是一个高效的卷积神经网络,适用于深度学习中的目标检测任务。
70 1
目标检测笔记(一):不同模型的网络架构介绍和代码
|
17天前
|
数据采集 前端开发 中间件
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第26天】Python是一种强大的编程语言,在数据抓取和网络爬虫领域应用广泛。Scrapy作为高效灵活的爬虫框架,为开发者提供了强大的工具集。本文通过实战案例,详细解析Scrapy框架的应用与技巧,并附上示例代码。文章介绍了Scrapy的基本概念、创建项目、编写简单爬虫、高级特性和技巧等内容。
40 4
|
17天前
|
网络协议 物联网 API
Python网络编程:Twisted框架的异步IO处理与实战
【10月更文挑战第26天】Python 是一门功能强大且易于学习的编程语言,Twisted 框架以其事件驱动和异步IO处理能力,在网络编程领域独树一帜。本文深入探讨 Twisted 的异步IO机制,并通过实战示例展示其强大功能。示例包括创建简单HTTP服务器,展示如何高效处理大量并发连接。
39 1