学习内容:

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. Redis深入学习笔记(一)Redis启动数据加载流程

    这两年使用Redis从单节点到主备,从主备到一主多从,再到现在使用集群,碰到很多坑,所以决定深入学习下Redis工作原理并予以记录. 本系列主要记录了Redis工作原理的一些要点,当然配置搭建和使用这 ...

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

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

  3. 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET

    目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用ser ...

  4. 【Spring学习笔记-MVC-4】SpringMVC返回Json数据-方式2

    <Spring学习笔记-MVC>系列文章,讲解返回json数据的文章共有3篇,分别为: [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://www ...

  5. 【Spring学习笔记-MVC-3】SpringMVC返回Json数据-方式1

    <Spring学习笔记-MVC>系列文章,讲解返回json数据的文章共有3篇,分别为: [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://www ...

  6. 【转】 Pro Android学习笔记(五七):Preferences(1):ListPreference

    目录(?)[-] 例子1ListPreference小例子 定义一个preferences XML文件 继承PreferenceActivity 用户定制偏好的读取 第一次运行时设置缺省值 设置Cat ...

  7. Android之MVP模式实现登录和网络数据加载

    MVP简介 相信大家对 MVC 都是比较熟悉了:M-Model-模型.V-View-视图.C-Controller-控制器,MVP作为MVC的演化版本,也是作为用户界面(用户层)的实现模式,那么类似的 ...

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

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

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

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

随机推荐

  1. Apache Solr查询语法(转)

    查询参数 常用: q - 查询字符串,必须的. fl - 指定返回那些字段内容,用逗号或空格分隔多个. start - 返回第一条记录在完整找到结果中的偏移位置,0开始,一般分页用. rows - 指 ...

  2. WPF窗体的命令绑定

    方法一:使用代码 <WpfUI:View.CommandBindings> <CommandBinding Command="Help" CanExecute=& ...

  3. SQL 性能调优日常积累【转】

    阅读目录 (1)选择最有效率的表名顺序(只在基于规则的优化器中有效) (2)WHERE子句中的连接顺序 (3)SELECT子句中避免使用 ‘ * ‘ (4)减少访问数据库的次数 (5)在SQL*Plu ...

  4. 使用golang 开发的 andriod应用

    最近在捣鼓一个东东,就是使用golang开发andriod应用.说起来简单操作起来还挺麻烦,中间又学习了很多东西.比如ubuntu,docker,angular,ionic,jquery mobile ...

  5. josephus Problem 中级(使用数组模拟链表,提升效率)

    问题描写叙述: 在<josephus Problem 0基础(使用数组)>中.我们提出了一种最简单直接的解决方式. 可是,细致审视代码之后.发现此种方案的效率并不高,详细体如今.当有人出局 ...

  6. [原]quick2.25让描边闪起来

    本文教大家如何使用shader让描边动起来.实质就是间隔一定时间改变描边的颜色.难点:如何通过程序把颜色传给shader.想在quick2.25里面尝试的朋友,参考quick2.25精灵变灰配置一下环 ...

  7. 【笔记】《DirectX 9.0 3D游戏开发编程基础》:Direct3D初始化

    Direct3D初始化大概分为4个步骤: 1.获取接口IDirect3D9的指针.(Direct3DCreate9函数调用). 该接口用户获取系统中物理硬件设备的信息并创建接口IDirect3DDev ...

  8. ALTER SEQUENCE 修改序列解决唯一约束冲突 unique constraint violated

    背景 自增序列会遇到也会遇到唯一约束冲突吗?是的,最常见的情况就是数据迁移之后,导致数据最大值超过序列值. 软件开发中不遇到些出乎意料的问题,总感觉不太够劲. 修改序列(ALTER SEQUENCE) ...

  9. java 流

    http://www.iteye.com/magazines/132-Java-NIO http://liyuanning.blog.163.com/blog/static/4573228620101 ...

  10. C# Json帮助类

    using System; using System.Collections.Generic; using System.Web; using System.Text; using System.Re ...