Volley的使用(一):get+post

Volley的使用

Volley是一种数据请求的框架,跟xUtils功能相同。
从 Android 6 开始,Apache HttpClient 被废弃了,这就导致如果想要使用 Volley,要么将 Compile SDK 修改为 23 以下,要么使用

   android {
        useLibrary 'org.apache.http.legacy'
    }

来增加 HttpClient 支持。

粗暴的 Retry Policy

默认超时事件 2.5s,基本算是鸡肋的配置,因为除了 wifi 环境,没可能在 2.5s 之内拿到响应,所以每次都得重新设置。

1 Volley的3中请求方式

StringRequest:请求的是String数据
JsonObjectRequest:请求的是JsonObject数据
JsonArrayRequest:请求的是JsonArray数据

2 Volley的基本使用步骤

1 在application中声明全局的请求队列:RequestQueue
2 创建并使用3种请求方式中的一种
3 给请求方式设置tag(非必要)
4 将请求添加到请求队列中

也可以这么说:

1 创建RequestQueue对象
2 创建Request对象
3 添加Request对象

注意:

1 添加联网权限
2 若使用的是Eclipse:添加Volley.jar
3 若使用的AS: 在app的build.gradle的dependencies下添加:compile ‘eu.the4thfloor.volley:com.android.volley:2015.05.28’

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')

    compile 'com.android.support:appcompat-v7:24.2.0'
    testCompile 'junit:junit:4.12'
    compile 'eu.the4thfloor.volley:com.android.volley:2015.05.28'
}

2.1 在application中声明全局的请求队列:RequestQueue

package com.baidu.volleydemo01;
import android.app.Application;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;
public class AppAppliation extends Application {

private  static RequestQueue queue;

    @Override
    public void onCreate() {
        super.onCreate();

        queue = Volley.newRequestQueue(getApplicationContext());
    }


    public static RequestQueue getQueue(){
        return queue;
    }
}

2.2 创建并使用3种请求方式中的一种

2.3 给请求方式设置tag(非必要)

2.4 将请求添加到请求队列中

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";
    public Context context = this;

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

          volleyGet();
}

方法:volleyGet

   public void volleyGet() {
        //聚合数据笑话大全
        String url ="http://japi.juhe.cn/funny/type.from?key=ce35f09937807e2f1abd0dbe9e059713";
        //创建StringRequest请求方式
        StringRequest request = new StringRequest(url,
                new Response.Listener() {
                    @Override
                    public void onResponse(String response) {
                        Toast.makeText(context, "onResponse" + response, Toast.LENGTH_LONG).show();
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(context, "onErrorResponse" + error, Toast.LENGTH_LONG).show();

            }
        });
        //设置标签
        request.setTag("volleyGet");
        AppAppliation.getQueue().add(request);//将请求添加到队列中
}

点击下载源码

Volley带参数Post请求

请求的是聚合数据,大家申请新数据的时候有个别数据需要审核身份证。
应用也需要认证,未认证的应用只可以使用2个月,2个月后再使用该接口会提示10005,我下面上传的源码申请日期是2016-9-26,所以2016-11-26前是可以请求到具体的数据的。

这里写图片描述

需要满足的条件

必须是post请求

下面的demo对request、requestTag、url进行了简单的封装。

Step1:初始化

public class MyApplication extends Application {
    private static RequestQueue requestQueue;

    @Override
    public void onCreate() {
        super.onCreate();
        requestQueue = Volley.newRequestQueue(getApplicationContext());
    }

    public static RequestQueue getRequestQueue(){
        return requestQueue;
    }
}

Step2:Url

把url放在单独的类中便于管理。

public class NetUrl {
   //新闻
   public static final String NEWSTOP = "http://v.juhe.cn/toutiao/index";
}

来源:
Volley的使用(一):get+post_第1张图片
点击“接口”,进去后:
Volley的使用(一):get+post_第2张图片

可以看到接口地址,请求方式,需要上传的参数。

Step3:RequestTag

由于实际项目中请求数据不止一次,那么RequestTag也会有多个,把他们都放在一个类中便于管理,每一个tag就是调用他的类名。

public enum  RequestTag {

    MAINACTIVITY,
}

Step4:封装StringRequest

由于每次请求都需要创建StringRequest对象进行post请求,所以我们把它放在一个类中,便于复用。
每次request的url 、map、requestTag是不一样的,所以这3个参数需要传入。

public class MainRequest {

    private static final String TAG = "MainRequest";

    public void makePostRequest(String url,final Map map,RequestTag requestTag){
        StringRequest request = new StringRequest(Request.Method.POST,url, new Response.Listener() {
            @Override
            public void onResponse(String response) {
                Log.d(TAG,"response="+response);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.d(TAG,"error="+error.getMessage());
            }
        }){
            @Override
            protected Map getParams() throws AuthFailureError {
                return map;
            }
        };
        request.setTag(requestTag);
        MyApplication.getRequestQueue().add(request);
    }
}

Step5:带参数请求

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity" ;

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

        Map map = new HashMap<>();
        map.put("key","593143c7f820e7be85d82b72fa71ea5f");
        new MainRequest().makePostRequest(NetUrl.NEWSTOP,map, RequestTag.MAINACTIVITY);
    }
}

请求到的数据:log

Volley的使用(一):get+post_第3张图片

Volley带参数Get请求

需要重写getHeaders()方法,但是我测试失败了,有知道原因的请留言。

Step1: 添加参数

Map<String, String> map = new HashMap<>();
map.put("key", "f1b5d3fd04ac2fa350e8f9fef50af6e7");
map.put("sort", "desc");
map.put("time", "1418816972");
new MainRequest().makeGetRequest(NetUrl.JOKE, map, RequestTag.MAINACTIVITY);

Step2: makeGetRequest(String url, final Map

//get请求
public void makeGetRequest(String url, final Map<String, String> map, RequestTag requestTag) {
    StringRequest request = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            Log.d(TAG, "response=" + response);
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.d(TAG, "error=" + error.getMessage());
        }
    }) {
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            return map;
        }
    };
    request.setTag(requestTag);
    MyApplication.getRequestQueue().add(request);
}

Volley带参数Get请求:拼接url

Step1:BaseUrl

public class NetUrl {
    //新闻
    public static final String NEWSTOP = "http://v.juhe.cn/toutiao/index";
    //笑话
    public static final String JOKE ="http://japi.juhe.cn/joke/content/list.from";
}

Step2:拼接url

//按照聚合API,只需要传key + sort + time
String url = NetUrl.JOKE + "?"
        + "key=f1b5d3fd04ac2fa350e8f9fef50af6e7" + "&"
        + "sort=asc" + "&"
        + "time=1418745237";
new MainRequest().makeGetRequest(url, RequestTag.MAINACTIVITY);

Step3: makeGetRequest(String url, RequestTag requestTag)

//get请求
public void makeGetRequest(String url, RequestTag requestTag) {
    StringRequest request = new StringRequest(Request.Method.GET, url, new Response.Listener() {
        @Override
        public void onResponse(String response) {
            Log.d(TAG, "response=" + response);
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.d(TAG, "error=" + error.getMessage());
        }
    });
    request.setTag(requestTag);
    MyApplication.getRequestQueue().add(request);
}

Step4:请求到的数据:log

这里写图片描述

其它

Demo:VolleyDemo1
参考:
Android Volley完全解析(一),初识Volley的基本用法
【Volley】缺陷

总结

Volley的使用(一):get+post
Volley的使用(二):加载网络图片
Volley的使用(三):Volley与Activity的联动 + Volley的二次封装

你可能感兴趣的:(第三方开源库)