一、Volley简介
Volley网络框架是Google公司在2013年发布的一款Android平台上的网络请求通信库。以下是对Volley的简单归纳。
Volley的优点:
Volley的缺点:
Volley不适合文件的上传和下载,当我们有上传和下载的需求的时候,可以考虑其他框架
为什么要使用Volley:
使用Volley从服务器端获取数据的几种方式:
本帖解决的有关Volley的四个问题:
二、Volley的网络请求队列的建立和取消队列请求
我们可以建立一个全局的请求队列,再在需要的时候建立一个请求,并将这个请求加入到请求队列中,这样一来整个APP的请求都可以通过这个队列来管理。因为Volley有全局请求队列这一功能,所以Volley更适合于并发的、对效率和性能要求非常好的场景。我们需要建立一个请求队列所在的全局类(继承自Application类),代码如下:
1 public class MyApplication extends Application {
2 private static RequestQueue queue; // Volley的全局请求队列
3
4 @Override
5 public void onCreate() {
6 super.onCreate();
7 // 创建Application的同时初始化Volley全局请求队列
8 queue = Volley.newRequestQueue(getApplicationContext());
9 }
10
11 // 静态方法返回Volley全局请求队列
12 public static RequestQueue getRequestQueue() {
13 return queue;
14 }
15 }
因为涉及到Application的关系,所以我们需要在AndroidMenifest文件的<application>标签中添加application的引用: android:name=".com.tools.MyApplication" 。另外,因为使用Volley需要使用网络,所以我们还需要为项目添加网络权限: <uses-permission android:name="android.permission.INTERNET" /> 。下面贴出AndroidMenifest文件中的所有代码:
1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.activity.volleyclient"> 4 5 <uses-permission android:name="android.permission.INTERNET" /> 6 7 <application 8 android:name=".com.tools.MyApplication" 9 android:allowBackup="true" 10 android:icon="@mipmap/ic_launcher" 11 android:label="@string/app_name" 12 android:supportsRtl="true" 13 android:theme="@android:style/Theme.NoTitleBar"> 14 <activity 15 android:name=".MainActivity" 16 android:label="@string/app_name" 17 android:theme="@android:style/Theme.NoTitleBar"> 18 <intent-filter> 19 <action android:name="android.intent.action.MAIN" /> 20 21 <category android:name="android.intent.category.LAUNCHER" /> 22 </intent-filter> 23 </activity> 24 </application> 25 26 </manifest>
到此为止,我们就已经创建好了请求队列。我们通过 MyApplication.getRequestQueue().add(stringRequestGet); 来向请求队列中添加请求(注意在添加之前必须为每个请求设置TAG标记,以便删除);用 MyApplication.getRequestQueue().cancelAll("tag"); 来删除请求队列中的请求。
三、Volley的GET和POST请求方式的使用
上面提到过,Volley获取服务端代码有三种方式:StringRequest、JsonObjectRequest和JsonArrayRequest。由于这三种方式的代码基本一样,而且后两种相比于第一种也有一定的局限性,所以这里就以StringRequest为例,贴出程序源码和结果。
1 public class MainActivity extends Activity { 2 // 基本的URL地址(GET和POST都用到这个地址,只不过GET需要在URL上添加参数,而POST不需要) 3 private static final String BASE_URL = "http://192.168.1.102:8080/VolleyServer/JsonServlet"; 4 private TextView result; 5 6 @Override 7 protected void onCreate(Bundle savedInstanceState) { 8 super.onCreate(savedInstanceState); 9 setContentView(R.layout.content_main); 10 result = (TextView) findViewById(R.id.result); 11 12 volleyGet(); 13 volleyPost(); 14 } 15 16 // 使用GET方式从服务端获取到JSON数据并加以解析 17 private void volleyGet() { 18 // 使用StringRequest获取JSON数据 19 String url = BASE_URL + "?key=person"; 20 StringRequest stringRequestGet = new StringRequest(Method.GET, url, new Response.Listener<String>() { 21 @Override 22 public void onResponse(String response) { 23 try { 24 addTextToResult("-->使用StringRequest用Get方式获取JSON数据\n"); 25 manageResponse(response); 26 } catch (Exception e) { 27 e.printStackTrace(); 28 } 29 } 30 }, new Response.ErrorListener() { 31 @Override 32 public void onErrorResponse(VolleyError volleyError) { 33 addTextToResult(volleyError.toString()); 34 } 35 }); 36 // 给Volley的Request请求对象标注TAG,并加入到全局请求队列中 37 stringRequestGet.setTag("StringRequestGet"); 38 MyApplication.getRequestQueue().add(stringRequestGet); 39 } 40 41 // 使用POST方式从服务端获取到JSON数据并加以解析 42 private void volleyPost() { 43 // 使用StringRequest获取JSON数据 44 String url = BASE_URL; 45 StringRequest stringRequestPost = new StringRequest(Method.POST, url, new Response.Listener<String>() { 46 @Override 47 public void onResponse(String response) { 48 try { 49 addTextToResult("-->使用StringRequest用Post方式获取JSON数据\n"); 50 manageResponse(response); 51 } catch (Exception e) { 52 e.printStackTrace(); 53 } 54 } 55 }, new Response.ErrorListener() { 56 @Override 57 public void onErrorResponse(VolleyError volleyError) { 58 addTextToResult(volleyError.toString()); 59 } 60 }) { 61 @Override 62 protected Map<String, String> getParams() throws AuthFailureError { 63 Map<String, String> hashMap = new HashMap<>(); 64 hashMap.put("key", "person"); 65 return hashMap; 66 } 67 }; 68 stringRequestPost.setTag("StringRequestPost"); 69 MyApplication.getRequestQueue().add(stringRequestPost); 70 } 71 72 // 将参数中的文本添加到界面上的TextView中(在原文本的基础上添加) 73 private void addTextToResult(String text) { 74 String currentText = result.getText().toString(); 75 currentText += text; 76 result.setText(currentText); 77 } 78 79 // 将使用Volley获取到的服务端JSON数据进行解析后添加到结果TextView中 80 private void manageResponse(String response) { 81 try { 82 JSONObject jsonObject = new JSONObject(response).getJSONObject("person"); 83 addTextToResult("姓名:" + jsonObject.getString("name") + "\n年龄:" + jsonObject.getInt("age") + "\n地址:" + 84 jsonObject.getString("address") + "\n\n"); 85 } catch (Exception e) { 86 e.printStackTrace(); 87 } 88 } 89 90 @Override 91 protected void onStop() { 92 // 结束Activity的同时销毁全局请求队列中的所有请求 93 super.onStop(); 94 MyApplication.getRequestQueue().cancelAll("StringRequestGet"); 95 MyApplication.getRequestQueue().cancelAll("StringRequestPost"); 96 } 97 }
运行结果如下:
四、Volley与Activity生命周期的联动
所谓的和Activity生命周期的联动,就是在Activity被销毁的时候(调用Activity的onStop()方法的时候),同时销毁所有的Volley请求对象。代码已经包含在MainActivity的代码中,这里再贴一遍:
1 @Override 2 protected void onStop() { 3 // 结束Activity的同时销毁全局请求队列中的所有请求 4 super.onStop(); 5 MyApplication.getRequestQueue().cancelAll("StringRequestGet"); 6 MyApplication.getRequestQueue().cancelAll("StringRequestPost"); 7 }
五、Volley的简单的二次封装
未完待续。。。。。。
原文:http://www.cnblogs.com/blog-wzy/p/5197312.html