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

目录
相关文章
|
3月前
|
监控 安全
从 Racket 语言出发,创新员工网络监控软件的框架
在数字化企业环境中,员工网络监控软件对于保障信息安全和提升效率至关重要。Racket 语言凭借其独特特性和强大功能,为开发创新的监控软件提供了新可能。通过捕获和分析网络数据包、记录员工网络活动日志,甚至构建复杂的监控框架,Racket 能够满足企业的定制化需求,为企业信息安全和管理提供强有力支持。未来,基于 Racket 的创新解决方案将不断涌现。
55 6
|
2月前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
145 6
|
3月前
|
机器学习/深度学习 人工智能
类人神经网络再进一步!DeepMind最新50页论文提出AligNet框架:用层次化视觉概念对齐人类
【10月更文挑战第18天】这篇论文提出了一种名为AligNet的框架,旨在通过将人类知识注入神经网络来解决其与人类认知的不匹配问题。AligNet通过训练教师模型模仿人类判断,并将人类化的结构和知识转移至预训练的视觉模型中,从而提高模型在多种任务上的泛化能力和稳健性。实验结果表明,人类对齐的模型在相似性任务和出分布情况下表现更佳。
87 3
|
3月前
|
安全 网络安全 区块链
网络安全与信息安全:构建数字世界的防线在当今数字化时代,网络安全已成为维护个人隐私、企业机密和国家安全的重要屏障。随着网络攻击手段的不断升级,从社交工程到先进的持续性威胁(APT),我们必须采取更加严密的防护措施。本文将深入探讨网络安全漏洞的形成原因、加密技术的应用以及提高公众安全意识的重要性,旨在为读者提供一个全面的网络安全知识框架。
在这个数字信息日益膨胀的时代,网络安全问题成为了每一个网民不可忽视的重大议题。从个人信息泄露到企业数据被盗,再到国家安全受到威胁,网络安全漏洞如同隐藏在暗处的“黑洞”,时刻准备吞噬掉我们的信息安全。而加密技术作为守护网络安全的重要工具之一,其重要性不言而喻。同时,提高公众的安全意识,也是防范网络风险的关键所在。本文将从网络安全漏洞的定义及成因出发,解析当前主流的加密技术,并强调提升安全意识的必要性,为读者提供一份详尽的网络安全指南。
|
1月前
|
机器学习/深度学习 算法 PyTorch
基于图神经网络的大语言模型检索增强生成框架研究:面向知识图谱推理的优化与扩展
本文探讨了图神经网络(GNN)与大型语言模型(LLM)结合在知识图谱问答中的应用。研究首先基于G-Retriever构建了探索性模型,然后深入分析了GNN-RAG架构,通过敏感性研究和架构改进,显著提升了模型的推理能力和答案质量。实验结果表明,改进后的模型在多个评估指标上取得了显著提升,特别是在精确率和召回率方面。最后,文章提出了反思机制和教师网络的概念,进一步增强了模型的推理能力。
66 4
基于图神经网络的大语言模型检索增强生成框架研究:面向知识图谱推理的优化与扩展
|
2月前
|
人工智能 自然语言处理
WebDreamer:基于大语言模型模拟网页交互增强网络规划能力的框架
WebDreamer是一个基于大型语言模型(LLMs)的网络智能体框架,通过模拟网页交互来增强网络规划能力。它利用GPT-4o作为世界模型,预测用户行为及其结果,优化决策过程,提高性能和安全性。WebDreamer的核心在于“做梦”概念,即在实际采取行动前,用LLM预测每个可能步骤的结果,并选择最有可能实现目标的行动。
75 1
WebDreamer:基于大语言模型模拟网页交互增强网络规划能力的框架
|
2月前
|
JSON 数据处理 Swift
Swift 中的网络编程,主要介绍了 URLSession 和 Alamofire 两大框架的特点、用法及实际应用
本文深入探讨了 Swift 中的网络编程,主要介绍了 URLSession 和 Alamofire 两大框架的特点、用法及实际应用。URLSession 由苹果提供,支持底层网络控制;Alamofire 则是在 URLSession 基础上增加了更简洁的接口和功能扩展。文章通过具体案例对比了两者的使用方法,帮助开发者根据需求选择合适的网络编程工具。
46 3
|
2月前
|
存储 安全 网络安全
网络安全法律框架:全球视角下的合规性分析
网络安全法律框架:全球视角下的合规性分析
65 1
|
2月前
|
数据采集 前端开发 中间件
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第26天】Python是一种强大的编程语言,在数据抓取和网络爬虫领域应用广泛。Scrapy作为高效灵活的爬虫框架,为开发者提供了强大的工具集。本文通过实战案例,详细解析Scrapy框架的应用与技巧,并附上示例代码。文章介绍了Scrapy的基本概念、创建项目、编写简单爬虫、高级特性和技巧等内容。
118 4
|
3月前
|
Web App开发 安全 程序员
FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势
多年的互联网寒冬在今年尤为凛冽,坚守安卓开发愈发不易。面对是否转行或学习新技术的迷茫,安卓程序员可从三个方向进阶:1)钻研谷歌新技术,如Kotlin、Flutter、Jetpack等;2)拓展新功能应用,掌握Socket、OpenGL、WebRTC等专业领域技能;3)结合其他行业,如汽车、游戏、安全等,拓宽职业道路。这三个方向各有学习难度和保饭碗指数,助你在安卓开发领域持续成长。
103 1
FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势