Android Volley网络通信详解一

转载请注明:
http://blog.csdn.net/sinat_30276961/article/details/48496495

Volley介绍

我们开发应用,一般都涉及到网络通信。而在android端,网络通信就要用到两个类:HttpURLConnection和HttpClient。(现在,google在Android 6.0已经把HttpClient给打入冷宫了。)

一般来说,不推荐自己去写网络通信框架。如果你很牛,那么你可以试着写写。学习需要的话,也可以仿照着写写看。目前,在应用开发时,还是使用老外写的性能优越的框架吧。

目前来看,开源的网络通信框架真心多,比方说AsyncHttpClient、Universal-Image-Loader、Picasso、Glide、okhttp等。这些都有各自的优点和使用范围。我们要根据实际需要选择合适的框架。

这里,我就来介绍一下google推出的Volley。既然是google推出的,那肯定是精品喽,都开发android框架的,写写网络通信框架那简直绰绰有余。

说了一大堆,那么Volley有啥好处呢?

首先Volley使用很简单,容易上手。其次,volley网络请求快。再者,volley还提供了很强大的图片下载、处理模块。

往深处说的话,还有很多,比方说:

1.它还提供透明的缓存机制,啥意思呢,也就是说,你可以管理、维护它的缓存机制。
2.它会自动安排网络请求,多线程并发执行,并且可以设置请求的优先级。
3.它可以让用户自己取消网络请求。
4.它的请求还支持扩展,你可以根据自己需要,扩展出一个请求。
5.添加请求可以在任意线程,包括UI线程;接收响应在UI线程。

综上所述,volley很适合那种需要不断访问大量小数据的应用,比方说资讯,新闻啊什么的。

但是它也有不足点,那就是别拿它去下载大文件或者是需要接收大数据的响应。因为它在解析网络数据时,都是在内存里操作的。这就是它快的主要原因之一,快了也是要代价的。

Volley下载

ok,那么我们开始Volley之旅。首先,需要它的jar包。可以通过git下载

git clone https://android.googlesource.com/platform/frameworks/volley

如果你没有git,那么也没事,直接访问https://github.com/mcxiaoke/android-volley,里面有镜像代码。

然后可以通过如下方式:
For Maven

<dependency>
    <groupId>com.mcxiaoke.volley</groupId>
    <artifactId>library</artifactId>
    <version>1.0.19</version>
</dependency>

For Gradle

compile 'com.mcxiaoke.volley:library:1.0.19'

我是使用Android Studio的,所以在build.gradle里添加并同步:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.2.1'
    compile 'com.mcxiaoke.volley:library:1.0.19'
}

Eclipse用户,直接下载jar文件,然后放到libs文件夹里。

简单网络请求

OK,我先从最简单的网络请求开始讲起:StringRequest和JsonRequest。

StringRequest

StringRequest是最基本的HTTP请求,我会通过一个网页地址,来获得它的网页源代码字符串。

使用Volley,首先你要获取一个RequestQueue,这个是一个请求队列,你可以在里面添加http请求。

然后就是创建StringRequest请求。很简单,我就直接贴码了:

public class SimpleRequest extends AppCompatActivity {
    RequestQueue queue;
    TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_simple_request);

        textView = (TextView) findViewById(R.id.text);

        queue = Volley.newRequestQueue(this);
    }

    private void peformStringRequest() {
        String url = "http://3g.baidu.com";

        StringRequest stringRequest = new StringRequest(
                Request.Method.GET,
                url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        textView.setText(response.substring(0,1000));
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        textView.setText("That didn't work!");
                    }
                }
        );
        queue.add(stringRequest);
    }

可以看到,在onCreate()里先创建了一个RequestQueue,然后在peformStringRequest里创建了StringRequest,并添加到RequestQueue里。

看下结果:

这里写图片描述

OK,很简单吧。

JSON Request

Volley提供了两个json请求类:JsonArrayRequest和JsonObjectRequest。知道Json的童鞋一看就知道。前者是返回JsonArray,后者返回JsonObject。

这里我就讲一下JsonObjectRequest,另一个也一样创建就行。

    private void performJsonRequest() {
        String url = "http://m.weather.com.cn/data/101010100.html";

        JsonObjectRequest jsonRequest = new JsonObjectRequest(
                Request.Method.GET,
                url,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        textView.setText(response.toString());
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        textView.setText(error.getMessage());
                    }
                }
        );
        queue.add(jsonRequest);
    }

代码很简单,这里要说下,那个http://m.weather.com.cn/data/101010100.html貌似已经不能再获取json了。所以上面的代码运行时,可能json那个获取不到,会出错。如果你要测试的话,可以自己用tomcat来返回一个json。

从上面两个例子,可以看出,使用Volley来发送http请求是多么的简单。

Post

我上面举的两个例子都是GET请求,那么POST是怎么发的呢?

我们拿StringRequest来讲,首先还是创建RequestQueue,然后再创建StringRequest,在里面传入的第一个参数改成Request.Method.POST。

ok,那么参数值在哪里传呢?我们去看下源码,进入StringRequest,看其方法:

这里写图片描述

木有!好吧,不在这里,那么往上找,看Request类。

这里写图片描述

。。还是没有,好吧,那就全部方法都看下:

这里写图片描述

看到了吧,getParams()和getParamsEncoding()。我们来看下代码:

    protected Map<String, String> getParams() throws AuthFailureError {
        return null;
    }

    protected String getParamsEncoding() {
        return DEFAULT_PARAMS_ENCODING;
    }

“protected”,看到了吧,就是让你复写的。

ok,那么就清楚了。我贴下大致代码:

    StringRequest request = new StringRequest(
            Request.Method.POST,
            url,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                }
            }
    ){
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String, String> map = new HashMap<>();
            map.put("param1", "value1");
            map.put("param2", "value2");
            return map;
        }

        @Override
        protected String getParamsEncoding() {
            return "GBK";
        }
    };

ok,volley的介绍和基本使用讲解完了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值