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

目录
相关文章
|
1月前
|
机器学习/深度学习
NeurIPS 2024:标签噪声下图神经网络有了首个综合基准库,还开源
NoisyGL是首个针对标签噪声下图神经网络(GLN)的综合基准库,由浙江大学和阿里巴巴集团的研究人员开发。该基准库旨在解决现有GLN研究中因数据集选择、划分及预处理技术差异导致的缺乏统一标准问题,提供了一个公平、用户友好的平台,支持多维分析,有助于深入理解GLN方法在处理标签噪声时的表现。通过17种代表性方法在8个常用数据集上的广泛实验,NoisyGL揭示了多个关键发现,推动了GLN领域的进步。尽管如此,NoisyGL目前主要适用于同质图,对异质图的支持有限。
41 7
|
1月前
|
前端开发 数据处理 Android开发
Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍
本文深入探讨了Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍,以及具体操作步骤、常见问题解决、高级调试技巧、团队协作中的调试应用和未来发展趋势,旨在帮助开发者提高调试效率,提升应用质量。
51 8
|
1月前
|
安全 Linux 网络安全
nmap 是一款强大的开源网络扫描工具,能检测目标的开放端口、服务类型和操作系统等信息
nmap 是一款强大的开源网络扫描工具,能检测目标的开放端口、服务类型和操作系统等信息。本文分三部分介绍 nmap:基本原理、使用方法及技巧、实际应用及案例分析。通过学习 nmap,您可以更好地了解网络拓扑和安全状况,提升网络安全管理和渗透测试能力。
145 5
|
1月前
|
算法 JavaScript Android开发
|
2月前
|
网络协议 物联网 虚拟化
|
1月前
|
开发框架 Dart Android开发
安卓与iOS的跨平台开发:Flutter框架深度解析
在移动应用开发的海洋中,Flutter作为一艘灵活的帆船,正引领着开发者们驶向跨平台开发的新纪元。本文将揭开Flutter神秘的面纱,从其架构到核心特性,再到实际应用案例,我们将一同探索这个由谷歌打造的开源UI工具包如何让安卓与iOS应用开发变得更加高效而统一。你将看到,借助Flutter,打造精美、高性能的应用不再是难题,而是变成了一场创造性的旅程。
|
2月前
|
网络协议 Shell 网络安全
解决两个 Android 模拟器之间无法网络通信的问题
让同一个 PC 上运行的两个 Android 模拟器之间能相互通信,出(qiong)差(ren)的智慧。
34 3
|
2月前
|
Java 程序员 API
Android|集成 slf4j + logback 作为日志框架
做个简单改造,统一 Android APP 和 Java 后端项目打印日志的体验。
139 1
|
1月前
|
网络协议 Unix Linux
精选2款C#/.NET开源且功能强大的网络通信框架
精选2款C#/.NET开源且功能强大的网络通信框架