欢迎使用CSDN-markdown编辑器

Volley简介

volley的英文意思为‘群发’、‘迸发’。Volley是2013年谷歌官方发布的一款Android平台上的网络通信库。Volley非常适合一些数据量不大,但需要频繁通信的网络操作。使用Volley进行网络开发可以使我们的开发效率得到很大的提升,而且性能的稳定性也比较高。但是Volley不适用于文件的上传下载操作。

Volley的特点:

1 使网络通信更快,更简单,更健壮;

2 Get/Post网络请求及网络图像的高效率异步请求;  

3 可以对网络请求的优先级进行排序处理;

4 可以进行网络请求的缓存;

5 可以取消多级别请求;

6 可以和Activity生命周期联动。

为什么要使用Volley?

功能上:

高效的Get/Post方式的数据请求交互;

网络图片的加载和缓存过程简单化。

其他:

谷歌官方推出的,比较权威;

性能很稳定、强劲。

如何使用Volley

1.Volley的网络请求队列建立与取消队列的请求

使用Volley需要建立一个全局的请求队列,这样我们就可以将一个请求加入到这个全局队列中,并可以管理整个APP的所有请求,包括取消一个或所有的请求。

2.Volley的Get和Post请求方式的使用

Volley的Get和Post请求方式其实是对Android原生Get和Post请求方式进行的二次封装,对效率进行优化。在使用Get和Post请求方式之前,要先确认所请求的数据返回什么对象,Volley自带了三种返回类型:

StringRequest:主要使用在对请求数据的返回类型不确定的情况下,StringRequest涵盖了JsonObjectRequest和JsonArrayRequest。

JsonObjectRequest:当确定请求数据的返回类型为JsonObject时使用。

JsonArrayRequest:当确定请求数据的返回类型为JsonArray时使用。

3.Volley与Activity生命周期的联动

Volley中的请求与Activity的生命周期进行关联,这样可以在Android销毁时关闭Volley的请求,防止请求在后台运行造成内存溢出等情况方式。与Activity生命周期进行联动时需要设置Tag标签,因为取消请求需要在请求队列中通过Tag标签进行查找,与Activity的onStop中执行取消请求的操作。

下面进行演示:

首先下一个Volley的jar包放入项目的lib包中

1.需要自定义一个Application用于创建一个全局的请求队列。
MyAppcation.java

public class MyApplication extends Application{
    private static RequestQueue queues;
    @Override
    public void onCreate(){
        super.onCreate();
        queues = Volley.newRequestQueue(getApplicationContext());
    }

    public static RequestQueue getHttpQueues() {
        return queues;
    }
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.cbt.learnvolley"
          xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 添加网络操作权限 -->
    <uses-permission android:name="android.permission.INTERNET"/>

    <!-- 注册自定义的Application:android:name=".MyApplication" -->
    <application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>

使用Get方式请求数据返回StringRequest对象
MainActivity.java

public class MainActivity extends Activity {

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

    private void volleyGet(){
        String url = "";
        StringRequest request = new StringRequest(Method.Get,url,
            new Listener<String>(){
                @Override
                public void onResponse(String response){
                    //请求成功返回的字符串数据response
                    //处理方法
                    onFinish();//自己写
                }
            },
            new ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error){
                    //请求失败是处理方法
                    onError();//自己写
                }
            });
        //设置Tag标签,可以在全局请求队列中通过Tag标签进行请求的查找
        request.setTag("testGet");
        //将请求加入全局队列中
        MyApplication.getHttpQueues().add(request);
    }

使用Get方式请求数据返回JsonObjectRequest对象
知道请求返回的是Json格式的数据,所以我们可以直接使用JsonObjectRequest作为请求返回结果对象

下面使用Get请求方式返回一个JSON格式的IP地址信息

private void volleyGet(){
    String url = "";
    JsonObjectRequest request = new JsonObjectRequest(Method.GET, url, null,
    new Listener<JSONObject>){
        public void onResponse(JSONObject jsonObject){
            //方法
        }
    },
    new ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error){
            //请求失败是处理方法
            onError();//自己写
        }
    });
    request.setTag("testGet");
    MyApplication.getHttpQueues().add(request);
}

使用Post方式请求数据返回StringRequest对象

使用Post方式需要手动传递请求参数,可以重写Request类的getParams()方法将请求参数名和参数值放入Map中进行传递。

private void volleyPost() {
        String url = "https://tcc.taobao.com/cc/json/mobile_tel_segment.htm";
        StringRequest request = new StringRequest(Method.POST, url,
                new Listener<String>() {
                    @Override
                    public void onResponse(String s) {//s为请求返回的字符串数据
                        Toast.makeText(MainActivity.this,s,Toast.LENGTH_LONG).show();
                    }
                },
                new ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError volleyError) {
                        Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_LONG).show();
                    }
                }){
                    @Override
                    protected Map<String, String> getParams() throws AuthFailureError {
                        Map<String,String> map = new HashMap<>();
                        //将请求参数名与参数值放入map中
                        map.put("tel","15850781443");
                        return map;
                    }
                }
                ;
        //设置请求的Tag标签,可以在全局请求队列中通过Tag标签进行请求的查找
        request.setTag("testPost");
        //将请求加入全局队列中
        MyApplication.getHttpQueues().add(request);
    }
}

使用Post方式请求数据返回JsonObject对象

private void volleyPost() {
    String url = "http://www.kuaidi100.com/query";
    Map<String,String> map = new HashMap<>();
    map.put("type","yuantong");
    map.put("postid","229728279823");
    //将map转化为JSONObject对象
    JSONObject jsonObject = new JSONObject(map);

    JsonObjectRequest request = new JsonObjectRequest(Method.POST, url, jsonObject,
            new Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject jsonObject) {//jsonObject为请求返回的Json格式数据
                    Toast.makeText(MainActivity.this,jsonObject.toString(),Toast.LENGTH_LONG).show();
                }
            },
            new ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError volleyError) {
                    Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_LONG).show();
                }
            });
    //设置请求的Tag标签,可以在全局请求队列中通过Tag标签进行请求的查找
    request.setTag("testPost");
    //将请求加入全局队列中
    MyApplication.getHttpQueues().add(request);
}

.与Activity生命周期联动
可以在Activity关闭时取消请求队列中的请求。

@Override
protected void onStop() {
    super.onStop();
    //通过Tag标签取消请求队列中对应的全部请求
    MyApplication.getHttpQueues().cancelAll("abcGet");
}

对Volley进行二次封装

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值