乱箭肃敌!——进击的Volley

Volley是google在2013年I/O大会上发布的关于网络请求的框架,其目的是为了解决HttpUrlConnect和
HttpClient(在android6.0中已经被废弃)使用不方便的问题,从字面上我们就可以看出来此框架的优点—-Volley(齐
射,发射),就好像很多人一起射箭,注意:是射箭,不是很多人一起发大炮,这点很重要,也是volley的一个特
性,它支持数据量不大,但是请求频繁的网络请求,如请求文字,图片,然而,如果是音频和视频的下载,这就属
于发大炮的级别了,volley可玩不转,所以使用的时候一定要注意。

Volley特点

  1. 通信更快,更简单
  2. Get、Post网络请求及网络图像的高效率异步处理请求
  3. 排序,对不同的网络请求进行优先级反应处理
  4. 网络请求的缓存
  5. 多级别取消请求
  6. 和Activity生命周期的联动

Volley不适合大文件的上传的下载

Volley框架的使用

Volley的get和post请求方式的使用

Get和Post请求接口数据的使用
· StringReuiest 用于对请求的数据返回结果类型不确定的情况下。StringReuiest涵盖后两种请求对象
· JsonObjectQuest 用于对请求的数据返回JsonObject类型
· JsonArrayRequest 用于对请求的数据返回JsonArray类型

Volley的网络请求队列建立和取消队列请求

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

Volley与Activity生命周期的联动

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

实例演示

使用Volley前需要往项目中导入Volley的jar包。
首先我们需要自定义一个Application用于创建一个全局的请求队列。

MyApplication.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import android.app.Application;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;

public class MyApplication extends Application{
public static RequestQueue queues;

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

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

AndroidManifest.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.gkdoe.volleydemo">

<uses-permission android:name="android.permission.INTERNET" />
<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对象

当想返回String类型的请求结果数据或者不清楚返回什么类型时可以用StringRequest对象。
下面使用Get请求方式返回一个String类型的手机归属地信息。

MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;

public class MainActivity extends AppCompatActivity {

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

private void volley_Get() {
String url = "https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=15850781443";//请求的接口地址
/**StringRequest
*第一个参数是请求方式
*第二个参数是请求的接口地址
*第三个参数是请求成功的回调
*第四个参数是请求失败的回调
*/
StringRequest request = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String s) {//s为请求返回的字符串数据
Toast.makeText(MainActivity.this,s, Toast.LENGTH_LONG).show();
}
},new Response.ErrorListener(){
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_LONG).show();
}
});
request.setTag("abcGet");//设置Tag标签,加入全局队列后,可以通过Tag标签进行寻找
MyApplication.getHttpQueues().add(request);//获取队列,并将请求加入到队列
}
}

运行结果:
volley01

使用Get方式请求数据返回JsonObjectRequest对象

MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import org.json.JSONObject;

public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
jsonObject_Get();
}

private void jsonObject_Get(){
String url = "http://api.juheapi.com/japi/toh?key=7bc8ff86168092de65576a6166bfc47b&v=1.0&month=11&day=1";
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
new Response.Listener<JSONObject>(){
@Override
public void onResponse(JSONObject jsonObject){//jsonObject为请求返回的Json格式数据
Toast.makeText(MainActivity.this,jsonObject.toString(),Toast.LENGTH_LONG).show();
}
}, new Response.ErrorListener(){
@Override
public void onErrorResponse(VolleyError volleyError){
Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_LONG).show();
}
});
request.setTag("request");//设置一个标签
MyApplication.getHttpQueues().add(request);//将请求加入到队列
}
}

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import java.util.HashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
volley_Post();
}

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

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

MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
volley_Post();
}

private void volley_Post(){
String url = "http://api.juheapi.com/japi/toh?";
Map<String,String> map = new HashMap<String,String>();
map.put("key","7bc8ff86168092de65576a6166bfc47b");
JSONObject jsonobj = new JSONObject(map);
JsonObjectRequest JsonRequest = new JsonObjectRequest(Request.Method.POST, url, jsonobj, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) {
Toast.makeText(MainActivity.this, "成功", Toast.LENGTH_SHORT).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(MainActivity.this, "失败", Toast.LENGTH_SHORT).show();
}
});
//设置请求的Tag标签,可以在全局请求队列中通过Tag标签进行请求的查找
JsonRequest.setTag("testPost");
//将请求加入全局队列中
MyApplication.getHttpQueues().add(JsonRequest);
}
}