Volley是一种数据请求的框架,跟xUtils功能相同。
从 Android 6 开始,Apache HttpClient 被废弃了,这就导致如果想要使用 Volley,要么将 Compile SDK 修改为 23 以下,要么使用
android {
useLibrary 'org.apache.http.legacy'
}
来增加 HttpClient 支持。
粗暴的 Retry Policy
默认超时事件 2.5s,基本算是鸡肋的配置,因为除了 wifi 环境,没可能在 2.5s 之内拿到响应,所以每次都得重新设置。
StringRequest:请求的是String数据
JsonObjectRequest:请求的是JsonObject数据
JsonArrayRequest:请求的是JsonArray数据
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'
}
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;
}
}
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);//将请求添加到队列中
}
点击下载源码
请求的是聚合数据,大家申请新数据的时候有个别数据需要审核身份证。
应用也需要认证,未认证的应用只可以使用2个月,2个月后再使用该接口会提示10005,我下面上传的源码申请日期是2016-9-26,所以2016-11-26前是可以请求到具体的数据的。
必须是post请求
下面的demo对request、requestTag、url进行了简单的封装。
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;
}
}
把url放在单独的类中便于管理。
public class NetUrl {
//新闻
public static final String NEWSTOP = "http://v.juhe.cn/toutiao/index";
}
可以看到接口地址,请求方式,需要上传的参数。
由于实际项目中请求数据不止一次,那么RequestTag也会有多个,把他们都放在一个类中便于管理,每一个tag就是调用他的类名。
public enum RequestTag {
MAINACTIVITY,
}
由于每次请求都需要创建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);
}
}
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);
}
}
需要重写getHeaders()方法,但是我测试失败了,有知道原因的请留言。
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);
//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);
}
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";
}
//按照聚合API,只需要传key + sort + time
String url = NetUrl.JOKE + "?"
+ "key=f1b5d3fd04ac2fa350e8f9fef50af6e7" + "&"
+ "sort=asc" + "&"
+ "time=1418745237";
new MainRequest().makeGetRequest(url, RequestTag.MAINACTIVITY);
//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);
}
Demo:VolleyDemo1
参考:
Android Volley完全解析(一),初识Volley的基本用法
【Volley】缺陷
Volley的使用(一):get+post
Volley的使用(二):加载网络图片
Volley的使用(三):Volley与Activity的联动 + Volley的二次封装