Volley框架搭建--小白级别的,外加Json解析

关于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": "全部"
    }
]

出于一些原因下面的代码中的URL没有写出来,这里换成你想要获内容的URL即可。

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<JSONArray>() {

			@Override
			public void onResponse(JSONArray response) {
				
				for(int i=0;i<response.length();i++){
					try {
						JSONObject IdType = response.getJSONObject(i);
						String id = IdType.optString("Id");
						String text = IdType.optString("text");
						Log.i("id = ,text =",id+text);
					} catch (JSONException e) {
						e.printStackTrace();
					}
				}
				
			}
		}, new Response.ErrorListener() {

			@Override
			public void onErrorResponse(VolleyError error) {
				Log.i("Volley框架以及json数据解析测试",error.getMessage());			
			}
		});
		myQueue.add(myRequest);
	}
}
运行结果:


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);
    }
}

这里主要有两个方法一个是  RequestQueue newRequestQueue(Context context, HttpStack stack)
另一个是 RequestQueue newRequestQueue(Context context)
但是后者方法里就一句就是调用了前者,因此可以说这里只是实现了一个功能(源码中的注释,笔者为了节省空间就把注释删掉了,有兴趣的可以自己去下载源码看一下):

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<JSONArray> listener, ErrorListener errorListener)

这里需要三个参数,第一个url是你要请求的地址,第二个是回调方法监听器,我们要在这做后续的处理,第三个是错误监听器。第一个参数和第三参数没有什么好研究的,我们看第二参数里有一个方法onRespose(JSONArray response),这里返回的是一个JSONArray,也就是说JsonArrayRequest返回的是一个JSONArray,那么JSONObjectRequest返回的也就是一个JSONObject了,下面看一下这个想法对不对:

  1. JsonObjectRequest request = new JsonObjectRequest(Method.GET, WEATHER_JSON_ADDRESS, null,   
  2.                 new Response.Listener<JSONObject>() {  
  3.   
  4.                     @Override  
  5.                     public void onResponse(JSONObject response) {
  6.                         System.out.println(response);  
  7.                     }  
  8.                 },  
  9.                 new Response.ErrorListener() {  
  10.   
  11.                     @Override  
  12.                     public void onErrorResponse(VolleyError error) {  
  13.                         
  14.                     }  
  15.                 });  

发现是对的,但是同时我们还发现这两个的参数不同,还得继续研究,但是这里可以总结一下了,要想使用Volley框架,其实只要先导入Volley.jar然后初始化一个请求队列RuquestQueue,然后新建一个json请求,里面的参数包含了两个监听器,一个是用回来返回请求结果的监听器,一个是错误监听器。大概就是这么一个流程。

JsonObjectRequest的参数有4个,第一个是Method,有两个选项一个是GET一个是POST,第二是URL,第三个这里给的是null,看一下源码的这个方法的原型是:

public JsonObjectRequest(int method, String url, JSONObject jsonRequest,Listener<JSONObject> listener, ErrorListener errorListener)

我们发现这个一个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的时候前者会返回一个默认值""而后者会报错。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值