专栏名称: 安卓开发精选
伯乐在线旗下账号,分享安卓应用相关内容,包括:安卓应用开发、设计和动态等。
目录
相关文章推荐
开发者全社区  ·  深圳公务员天也塌了 ·  昨天  
开发者全社区  ·  北京86年大叔自救式征婚相亲 ·  2 天前  
开发者全社区  ·  中国最难入的IT公司 ·  3 天前  
51好读  ›  专栏  ›  安卓开发精选

Android 网络编程(3):Volley用法全解析

安卓开发精选  · 公众号  · android  · 2016-08-20 08:28

正文

(点击 上方公众号 ,可快速关注)


来源:刘望舒

链接:blog.csdn.net/itachi85/article/details/51043704



前言


Volley想必很多人都用过,为了建立网络编程的知识体系,Volley是必须要讲的知识点,所以我这里有必要再次介绍一下Volley的使用。


1.Volley简介


在2013年Google I/O大会上推出了一个新的网络通信框架Volley。Volley既可以访问网络取得数据,也可以加载图片,并且在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。在使用Volley前请下载Volley库并放在libs目录下并add到工程中。


2.Volley网络请求队列


Volley请求网络都是基于请求队列的,开发者只要把请求放在请求队列中就可以了,请求队列会依次进行请求,一般情况下,一个应用程序如果网络请求没有特别频繁则完全可以只有一个请求队列(对应Application),如果非常多或其他情况,则可以是一个Activity对应一个网络请求队列,这就要看具体情况了,首先创建队列:


RequestQueue mQueue = Volley . newRequestQueue ( getApplicationContext ());


3.StringRequest的用法


StringRequest返回的数据是String类型的,我们查看下StringRequest的源码:


public class StringRequest extends Request {

private final Listener mListener ;

public StringRequest ( int method , String url , Listener listener , ErrorListener errorListener ) {

super ( method , url , errorListener );

this . mListener = listener ;

}

public StringRequest ( String url , Listener listener , ErrorListener errorListener ) {

this ( 0 , url , listener , errorListener );

}

... 省略

}


有两个构造函数,其中第一个比第二个多了一个请求的方法,如果采用第二个则默认是GET请求。好了,我们试着用GET方法来请求百度:


//创建请求队列

RequestQueue mQueue = Volley . newRequestQueue ( getApplicationContext ());

StringRequest mStringRequest = new StringRequest ( Request . Method . GET , "http://www.baidu.com" ,

new Response . Listener () {

@Override

public void onResponse ( String response ) {

Log . i ( "wangshu" , response );

}

}, new Response . ErrorListener () {

@Override

public void onErrorResponse ( VolleyError error ) {

Log . e ( "wangshu" , error . getMessage (), error );

}

});

//将请求添加在请求队列中

mQueue . add ( mStringRequest );


当然别忘了添加网络访问权限:


uses - permission android : name = "android.permission.INTERNET" />


请求结果不用说是百度界面的html文件:



4.JsonRequest的用法


和StringRequest类似,我们直接上代码:


RequestQueue mQueue = Volley . newRequestQueue ( getApplicationContext ());

JsonObjectRequest mJsonObjectRequest = new JsonObjectRequest ( Request . Method . POST , "http://api.1-blog.com/biz/bizserver/article/list.do" ,

new Response . Listener () {

@Override

public void onResponse ( JSONObject response ) {

Log . d ( "wangshu" , response . toString ());

}

}, new Response . ErrorListener () {

@Override

public void onErrorResponse ( VolleyError error ) {

Log . e ( "wangshu" , error . getMessage (), error );

}

}

);

mQueue . add ( mJsonObjectRequest );


运行程序返回的是一堆新闻的Json数据:



为了解析这些Json数据,我们用Gson来解析Json数据。下载Gson将jar包放在libs目录下并add进工程中。我们开始写article类用于存储数据:


public class Article {

private String desc ;

private String status ;

private List detail = new ArrayList ();

public List Article . detail > getDetail () {

return detail ;

}

public void setDetail ( List Article . detail > detail ) {

this . detail = detail ;

}

public String getDesc () {

return desc ;

}

public void setDesc ( String desc ) {

this . desc = desc ;

}

public String getStatus () {

return status ;

}

public void setStatus ( String status ) {

this . status = status ;

}

public class detail {

private String title ;

private String article_url ;

private String my_abstract ;

private String article_type ;

public String getTitle () {

return title ;

}

public void setTitle ( String title ) {

this . title = title ;

}

public String getArticle_url () {

return article_url ;

}

public void setArticle_url ( String article_url ) {

this . article_url = article_url ;

}

public String getMy_abstract () {

return my_abstract ;

}

public void setMy_abstract ( String my_abstract ) {

this . my_abstract = my_abstract ;

}

public String getArticle_type () {

return article_type ;

}

public void setArticle_type ( String article_type ) {

this . article_type = article_type ;

}

}

}


最后我们改写JsonRequest的请求回调:


RequestQueue mQueue = Volley . newRequestQueue ( getApplicationContext ());

JsonObjectRequest mJsonObjectRequest = new JsonObjectRequest ( Request . Method . POST , "http://api.1-blog.com/biz/bizserver/article/list.do" ,

new Response . Listener () {

@Override

public void onResponse ( JSONObject response ) {

Article mArticle = new Gson (). fromJson ( response . toString (), Article . class );

List Article . detail > mList = mArticle . getDetail ();

String title = mList . get ( 0 ). getTitle ();

Log . d ( "wangshu" , title );

}

}, new Response . ErrorListener () {

@Override

public void onErrorResponse ( VolleyError error ) {

Log . e ( "wangshu" , error . getMessage (), error );

}

}

);

mQueue . add ( mJsonObjectRequest );


来看看打印结果:



5.使用ImageRequest加载图片


ImageRequest已经是过时的方法了,和前面两种的用法类似:


RequestQueue mQueue = Volley . newRequestQueue ( getApplicationContext ());

ImageRequest imageRequest = new ImageRequest (

"http://img.my.csdn.net/uploads/201603/26/1458988468_5804.jpg" ,

new Response . Listener () {

@Override

public void onResponse ( Bitmap response ) {

iv_image . setImageBitmap ( response );

}

}, 0 , 0 , Bitmap . Config . RGB_565 , new Response . ErrorListener () {

@Override

public void onErrorResponse ( VolleyError error ) {

iv_image . setImageResource ( R . drawable . ico_default );

}

});

mQueue . add ( imageRequest );


查看ImageRequest的源码发现它可以设置你想要的图片的最大宽度和高度,在加载图片时如果图片超过期望的最大宽度和高度则会进行压缩:


public ImageRequest ( String url , Listener listener , int maxWidth , int maxHeight , ScaleType scaleType , Config decodeConfig , ErrorListener errorListener







请到「今天看啥」查看全文