关于Volley框架没怎么了解,现在开始了解一下:
Google 2013 I/O 大会上发布的一个网络通信库,处理一些网络方面的请求,还留意到Volley的强项是处理请求的次数非常的多但是流量不大的通信情况,如果流量特别的大的情况则不适用,比如下载视频等。
要想适用Volley框架必须要先下载volley.jar,这个网上都有,将其copy到libs目录下就可以了。按照我以前的思路二话不说,先拿过来用再分析的原则,我先copy了一个例子(这里的Json数据源是一个JsonArray)其内容如下:
[
{
"Id": "15",
"text": "消防报警"
},
{
"Id": "16",
"text": "门禁报警"
},
{
"Id": "17",
"text": "入侵报警"
},
{
"Id": "18",
"text": "设备报警"
},
{
"Id": "19",
"text": "能耗报警"
},
{
"Id": "All",
"text": "全部"
}
]
:
package com.example.jsontest;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.Response.ErrorListener;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
public class MainActivity extends Activity {
private RequestQueue myQueue;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myQueue = Volley.newRequestQueue(MainActivity.this);
String url = "http://.................";
JsonArrayRequest myRequest = new JsonArrayRequest(url, new Response.Listener() {
@Override
public void onResponse(JSONArray response) {
for(int i=0;i
运行结果:
2.分析
首先是前两句代码:
RequestQueue myQueue;
myQueue = Volley.newRequestQueue(MainActivity.this);
这里涉及到了两个类RequestQueue和Volley,这两个类我都不熟悉,那么按照原则看一下volley.jar中的源码:
Volley类
package com.android.volley.toolbox;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.http.AndroidHttpClient;
import android.os.Build;
import com.android.volley.Network;
import com.android.volley.RequestQueue;
import java.io.File;
public class Volley {
public static RequestQueue newRequestQueue(Context context, HttpStack stack) {
File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR);
String userAgent = "volley/0";
try {
String packageName = context.getPackageName();
PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0);
userAgent = packageName + "/" + info.versionCode;
} catch (NameNotFoundException e) {
}
if (stack == null) {
if (Build.VERSION.SDK_INT >= 9) {
stack = new HurlStack();
} else {
stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));
}
}
Network network = new BasicNetwork(stack);
RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network);
queue.start();
return queue;
}
public static RequestQueue newRequestQueue(Context context) {
return newRequestQueue(context, null);
}
}
Creates a default instance of the worker pool and calls {@link RequestQueue#start()} on it.
创建一个默认的实例,这个实例是一个工作池以及对于这个RequestQueue的响应。由于现在还是小白具体再深入的暂时不去理解了,现在大概知道了
RequestQueue myQueue;
myQueue = Volley.newRequestQueue(MainActivity.this);
这两句代码的意思是初始化了一个请求的队列(根据名字翻译的),并且为这个请求添加了一个回调方法。
下一句代码的原型是:
public JsonArrayRequest(String url, Listener
JsonObjectRequest的参数有4个,第一个是Method,有两个选项一个是GET一个是POST,第二是URL,第三个这里给的是null,看一下源码的这个方法的原型是:
public JsonObjectRequest(int method, String url, JSONObject jsonRequest,Listener
我们发现这个一个JSONObject的对象,应该是向URL传输的参数,后面的两个和JsonArrayRequest的一样。
最后一句:
myQueue.add(myRequest);
把这个请求添加到这个请求队列里。然后一个完整的使用Volley框架的请求一个JsonArray的例子就完成了。
最后如何从一个JsonArray中获取JSONObject:
JSONObject jsonObject = JSONArray.getJSONObject(i);
这样就可以了,然后如何从JSONObject里取出我们需要的字段的值呢,假设是String类型的:
String id = jsonObject.optString("Id");
这里就把第i个JSONObject对象里的key为Id的字段的值取出来了。
至于optString()和getString()的区别据说是当查询不到这个key的时候前者会返回一个默认值""而后者会报错。