学习内容:

1.使用Volley实现异步加载Json数据...

  Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后对对象进行解析,从而获取Json数据,另一种方式则是通过获取JsonArray的方式来对Json数据进行解析,其实就是Json数组...由于Json数据格式的不同,因此也就有了这两种方式...

  因此实现类也就成为了两个JsonObjectRequest.java和JsonArrayRequest.java,他们都 extends JsonRequest,而JsonRequest继承了Request类,重写了其中内部的一些方法...因为获取Json对象,提交这个请求已经是一个确定好的类型,因此需要对父类中的一些方式进行重写...Request只是为更多的请求方式提供了一个父类,其他类型的请求,需要使用新的类进行继承,重写,然后子类再充当父类,用新的子类进行继承和重写...从而实现了良好的扩展....

  那么JsonRequest为什么没有实现parseNetWorkResponse想必也就不用说了,对外提供接口,方便扩展和实现...

  我们先看看第一种,使用Volley获取JsonObject,从而解析获取Json数据...

1.JsonObjectRequest.java

  这里的源码就非常的简单了,没什么太多可说的...关键还是看如何调用...

package com.android.volley.toolbox;

import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Response;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.UnsupportedEncodingException;

public class JsonObjectRequest extends JsonRequest<JSONObject> {
    //指定提交方式和url来创建一个请求对象...
    public JsonObjectRequest(int method, String url, JSONObject jsonRequest,
            Listener<JSONObject> listener, ErrorListener errorListener) {
        super(method, url, (jsonRequest == null) ? null : jsonRequest.toString(), listener,
                    errorListener);
    }

    //通过url的形式来建立一个请求对象...
    public JsonObjectRequest(String url, JSONObject jsonRequest, Listener<JSONObject> listener,
            ErrorListener errorListener) {
        this(jsonRequest == null ? Method.GET : Method.POST, url, jsonRequest,
                listener, errorListener);
    }

    @Override
    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
        try {
            String jsonString =
                new String(response.data, HttpHeaderParser.parseCharset(response.headers)); //按照指定字符集解析..
            return Response.success(new JSONObject(jsonString),//返回成功数据...
                    HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        } catch (JSONException je) {
            return Response.error(new ParseError(je));
        }
    }
}

  调用的方式我们还是通过例子来完成...这里我们通过请求来获取Json数据...

  http://192.168.199.172:8080/JSP/Json_1.txt是这个样子的...简单的Json数据...

{
     "user":[
     {"userid":"1","username":"darker","userpassword":"49681888"},
         {"userid":"2","username":"darker_1","userpassword":"49681888"},
         {"userid":"3","username":"darker_2","userpassword":"49681888"}
      ]
 }

下面通过请求完成调用,获取其中的内容...

package com.example.oop;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {

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

    public void init(){
        RequestQueue queue=Volley.newRequestQueue(MainActivity.this);
        //这里没有重写错误方法...正常来说是需要重写的...
        mqueue.add(new JsonObjectRequest(Method.GET,"http://192.168.199.172:8080/JSP/Json_1.txt",url,new Listener<JSONObject>(){
        @Override
        public void Response(JSONObject response){
            //这里我们可以看到我们获取的就是JsonObject了...我们可以在这里进行解析,从而获取想要的数据...
        List<HasnMap<String,String>>list=new ArrayList<HashMap<String,String>>();
        String s[]=new String[]{"userid","username","userpassword"};
        try{
           JSONArray array=response.getJSONArray("user");
        for(int i=0;i<array.size();i++){
            JSONObject object=array.opt(i);
            Map<String,String>map=new HashMap<String,String>();
            for(String str:s){
                map.put(str,object.get(str));
            }
            list.add(map);
             for(int i=0;i<list.size();i++){
                for(int j=0;j<Json_id.length;j++){
                    System.out.println(list.get(i).get(Json_id[j]));
                }
            }
        }
     }catch(Exception e){}
        }
    }));

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

  通过Json对象,来解析Json数据的方式其实有很多种方式,这里我只列举了一个,通过把JsonObject转化成JsonArray的形式,然后对数组进行遍历,从而获取每一个数据信息...更多的方式我在博客中也进行了书写,大家可以去看看Android学习笔记之Json的使用...这是第一种通过获取JsonObject从而获取Json数据信息的...

  第二种方式:

2.JsonArrayRequest.java

  源码也就这点玩意...不是很难理解...

package com.android.volley.toolbox;

import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Response;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;

import org.json.JSONArray;
import org.json.JSONException;

import java.io.UnsupportedEncodingException;

public class JsonArrayRequest extends JsonRequest<JSONArray> {

    //这里只有一种方式,直接通过url来建立一个JsonArray请求对象...
    public JsonArrayRequest(String url, Listener<JSONArray> listener, ErrorListener errorListener) {
        super(Method.GET, url, null, listener, errorListener);
    }

    @Override
    protected Response<JSONArray> parseNetworkResponse(NetworkResponse response) {
        try {
            String jsonString =
                new String(response.data, HttpHeaderParser.parseCharset(response.headers));
            return Response.success(new JSONArray(jsonString),
                    HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        } catch (JSONException je) {
            return Response.error(new ParseError(je));
        }
    }
}

  看一下具体的调用过程...

  http://192.168.199.172:8080/JSP/JSON.txt的数据信息如下..

[
    {"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"},
    {"firstName":"Jason","lastName":"Hunter","email":"bbbb"},
    {"firstName":"Elliotte","lastName":"Harold","email":"cccc"}
]
 

  主函数的调用过程...有一些包没有引入,到时候书写时编译器会自动引入的...

package com.example.oop;

import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity{

        String url="http://192.168.199.172:8080/JSP/JSON.txt";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }

    public void init(){
        RequestQueue queue=Volley.newRequestQueue(MainActivity.this);
        mqueue.add(new JsonArrayRequest(url, new Listener<JSONArray>() {
    @Override
    public void OnResponse(JsonArray response){
        //TODO Auto-generated method stub
        try{
            for(int i=0;i<response.length;i++){
                JsonObject object=(JsonObject)response.opt(i);
                 Map<String,Object>map=new HashMap<String,Object>();
                for(String str:s){
                    map.put(str,object.get(str));
                }
                list.add(map);
            }
            for(int i=0;i<list.size();i++){
                for(int j=0;j<s.length;j++){
                    System.out.println(list.get(i).get(s[j]));
                }
            }
        }catch(Exception e){}
    }
}, new ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error){
        //TODO Auto-generated method stub
        System.out.println(error.toString());
    }
}));

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

  这里当请求成功之后,获取到的响应就是JsonArray对象了...然后通过遍历就直接能够获取到JsonArray里保存的数据信息了...这就是解析的另一种方式...直接获取Json数组...从而获取数据信息...

  JsonArrayRequest方式和JsonObjectRequest方式模式基本是相同的...只是对Json的数据格式要求并不一样...只需在Json的格式上发生以下简单的变化...

  JsonArrayRequest请求的Json数据格式[{},{}]...返回的形式是Json数组..

  JsonObjectRequest请求的Json数据格式["名称":[{},{}]]...返回的形式是Json对象..

  这样就完成了Json数据的获取+解析..获取过程由Volley实现,解析由我们去实现...

最后我们来看一下父类的源代码...

3.JsonRequest.java

  源代码其实也非常的简单...

package com.android.volley.toolbox;

import com.android.volley.NetworkResponse;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.VolleyLog;

import java.io.UnsupportedEncodingException;

public abstract class JsonRequest<T> extends Request<T> {
    /** Charset for request. */
    private static final String PROTOCOL_CHARSET = "utf-8"; //默认字符集..

    /** Content type for request. */
    private static final String PROTOCOL_CONTENT_TYPE =
        String.format("application/json; charset=%s", PROTOCOL_CHARSET);  //协议内容的类型...

    private final Listener<T> mListener; //成功监听...
    private final String mRequestBody;  //请求实体...

    //通过url构造请求对象..
    public JsonRequest(String url, String requestBody, Listener<T> listener,
            ErrorListener errorListener) {
        this(Method.DEPRECATED_GET_OR_POST, url, requestBody, listener, errorListener);
    }
    //通过指定方式+url来构造请求对象...
    public JsonRequest(int method, String url, String requestBody, Listener<T> listener,
            ErrorListener errorListener) {
        super(method, url, errorListener);
        mListener = listener;
        mRequestBody = requestBody;
    }
    //请求的分发...
    @Override
    protected void deliverResponse(T response) {
        mListener.onResponse(response);
    }
    //解析请求的抽象方法,使JsonArrayRequest和JsonObjectRequest去实现..
    @Override
    abstract protected Response<T> parseNetworkResponse(NetworkResponse response);

    //获取Post请求中实体内容的类型..
    @Override
    public String getPostBodyContentType() {
        return getBodyContentType();
    }

    //获取Post请求的实体部分...
    @Override
    public byte[] getPostBody() {
        return getBody();
    }
    //指定内容类型...
    @Override
    public String getBodyContentType() {
        return PROTOCOL_CONTENT_TYPE;
    }
    //获取实体内容的具体过程...
    @Override
    public byte[] getBody() {
        try {
            return mRequestBody == null ? null : mRequestBody.getBytes(PROTOCOL_CHARSET);
        } catch (UnsupportedEncodingException uee) {
            VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s",
                    mRequestBody, PROTOCOL_CHARSET);
            return null;
        }
    }
}

Android 学习笔记之Volley(七)实现Json数据加载和解析...的更多相关文章

  1. Android学习笔记之BitmapFactory.Options实现图片资源的加载...

    PS:小项目总算是做完了...历经20多天...素材,设计,以及实现全由自己完成...心力憔悴啊...该写写博客记录一下学习到的东西了... 学习内容: 1.使用BitmapFactory.Optio ...

  2. Android 学习笔记之Volley(六)实现获取服务器的字符串响应...

    学习内容: 1.使用StringRequest实现获取服务器的字符串响应...   前几篇一直都在对服务——响应过程的源码进行分析,解析了整个过程,那么Volley中到底实现了哪些请求才是我们在开发中 ...

  3. Android 学习笔记之Volley(八)实现网络图片的数据加载

    PS:最后一篇关于Volley框架的博客... 学习内容: 1.使用ImageRequest.java实现网络图片加载 2.使用ImageLoader.java实现网络图片加载 3.使用NetWork ...

  4. Android 学习笔记之Volley开源框架解析(一)

    PS:看完了LGD的六场比赛...让人心酸... 学习内容: 1.Http请求的过程... 2.Volley的简单介绍...   1.Http请求...   这里只是简单的说一下Http请求的过程.. ...

  5. Android 学习笔记之Volley开源框架解析(三)

      学习内容: 1.CacheDispatcher缓存请求调度... 2.Cache缓存数据的保存... 3.DiskBasedCache基于磁盘的缓存类实现方式...   前面说到使用Volley发 ...

  6. Android 学习笔记之Volley开源框架解析(五)

    学习内容: 1.PoolingByteArrayOutputStream 2.ByteArrayPool 3.HttpStack 4.HurlStack 5.HttpHeaderParser   前面 ...

  7. Android 学习笔记之Volley开源框架解析(四)

    学习内容: 1.NetWorkDispatcher网络请求线程调度... 2.NetWork网络请求抽象类... 3.BasicNetWork网络请求抽象类的具体实现... 4.NetWorkResp ...

  8. Android 学习笔记之Volley开源框架解析(二)

    PS:Volley已经学完,可以安心的写一下博客总结一下了... 学习内容: 1.Request的完整封装... 2.RetryPolicy,DefaultRetryPolicy(请求重试策略源码解析 ...

  9. 【Struts2学习笔记-8】Struts2实现json数据的返回

    需要的jar包 struts2-json-plugin-2.3.12.jar xwork-core-2.3.16.3.jar struts.xml 来自为知笔记(Wiz) 附件列表 IMG_20150 ...

随机推荐

  1. 转载:android自定义view实战(温度控制表)!

    效果图 package cn.ljuns.temperature.view; import com.example.mvp.R; import android.content.Context;impo ...

  2. MVC4中 访问webservice 出现无法找到资源的错误

    出现这个情况,是mvc将webservice.asmx解析成了控制器,下面先将这个控制器忽略 继续访问出现这样的错误: 下面修改配置文件 访问成功

  3. 在xilinxFPGA上使用microblaze及自写GPIO中断

    很久很久没有更新过博客了,今天来扒一扒FPGA上CPU软核的使用. 主要完成的功能:使用的开发板是nexys 4 DDR,板上有16个switch以及16个LED,需要完成microblaze对led ...

  4. Atiit 如何手写词法解析器

    Atiit 如何手写词法解析器 1.1. 通过编程直接从正则->nfa->dfa->表驱动词法解析一条龙自动生成.那是用程序自动生成是需要这样的,自己手写完全不必要这么复杂1 1.2 ...

  5. spring容器初始化执行某个方法

    在做web项目开发中,尤其是企业级应用开发的时候,往往会在工程启动的时候做许多的前置检查. 比如检查是否使用了我们组禁止使用的Mysql的group_concat函数,如果使用了项目就不能启动,并指出 ...

  6. Xcode开发技巧之Code Snippets Library

    http://blog.csdn.net/lin1986lin/article/details/21180007 目录(?)[-] 引言 什么是Code Snippets 如何新建Code Snipp ...

  7. 【iCore3 双核心板_ uC/OS-III】例程七:信号量——任务同步

    实验指导书及代码包下载: http://pan.baidu.com/s/1kVjeN2n iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  8. 【转】从 ArcGIS for Desktop 发布地图服务

    原文链接:http://resources.arcgis.com/zh-CN/help/tutorials/01z300000007000000.htm 本教程的目的是将地图服务直接从 ArcGIS ...

  9. echart.js的使用与API

    ---恢复内容开始--- echart.js的使用与API 1.echart.js的使用: 第一步:在head标签或body下创建一个script标签去引用echart.js,(该文件可以在echar ...

  10. Lucene 4.7 --创建索引

    Lucene的最新版本和以前的语法或者类名,类规定都相差甚远 0.准备工作: 1). Lucene官方API http://lucene.apache.org/core/4_7_0/index.htm ...