当前位置:文档之家› 一种基于JSON的Android终端远程获取解析数据的方法

一种基于JSON的Android终端远程获取解析数据的方法

网络与通信Network and Communication

一种基于JS O N的Android终端远程获取解析数据的方法!

赵鹏##骆德汉##梅领亮2

(1.广东工业大学信息工程学院,广东广州510006; 2.广东正业科技股份有限公司,广东东莞523270)

摘要:J S0N作为一种轻量级的数据交换格式,具有安全、快速、通用、数据通信量小等优点,这些优点使J S0N成为理想的数据 交换语言。A n d r o id移动终端对数据的远程访问量正飞速增长,对数据的远程获取方法也提出了更高的要求,而J S0N的众多优 点使之能很好地满足这一要求。文章在V o l le y框架中使用G E T方式远程获取J S0N数据,然后对J S0N数据进行解析处理,最

终通过H a n d le r把处理后的数据更新到U I控件上,从而实现J S0N数据在A n d r o id终端上的远程获取解析和显示。

关键词:Android ; J S0N ; V o lle y; Handler

中图分类号:T P391. 1文献标识码:A D0I:10. 19358/j. issn. 1674-7720.2017.21.018

引用格式:赵鹏,骆德汉,梅领亮.一种基于J S0N的A n d r o id终端远程获取解析数据的方法%J].微型机与应用,2017,36 (21)$

57-60.

A metliod of obtaining and resolving data remotely on Android terminal based on JS0N

Z h a o P e n g1,L u o D e h a n1,M e i L in g lia n g2

(1. Information Engineering Institute,Guangdong University of Technology,Guangzhou 510006,China;

2. Guangdong Zhengye Technology Stock Limited Com pany,Dongguan 523270,China)

A b stract :As a lightweight data-interchange format,JS0N has a lot of advantages,such as safe,fast,global,and small data traffic. Just because

of those excellent m erits,JS0N becomes an ideal data-interchange language. The remote access traffic of data of Android creasing in a very fast s p e e d,and it puts forward higher requirements to the method of remote acccs make itself meets those requirements perfectly. In this paper,we use the metliod of GET in Volley communication frameworlc to obtain JS0N data remotely. T h en,to resolve and handle JS0N data,and update the handled JS0N data to the widgets of UI finally though handler. By this w ay,we can obtain JS0N data rem otely,resolve it e fficiently,and display it on Android mobile terminal easily.

K e y w o r d s:Android ;JS0N;V o lle y;Handler

〇引言

在众多移动终端平台中,A n d r o i d平台的市场占有率最高。由于移动终端无法进行海量数据的存储和计算,因此大多数A n d r o id应用都采用“客户端”b “云端”的模式,该模式的关键就在于移动终端与服务器端的交互。移动 终端与服务器端的交互日益频繁,因此选择一种数据通信 量小、快速、安全、通用的数据通信方式就显得尤为重要[1]。J S0N作为一种轻量级的数据交换语言,具有安全、快速、通用、数据通信量小等特性,这让J0N成为了理想 的数据通信方式。

1关键技术

A n d r o id终端远程获取解析J S0N数据并显示的主要流程是:开启子线程,请求服务器,服务器对请求进行处理 并做出响应,子线程接收响应,获取J S0N数据,然后对数 据进行解析,最后通过H a n d le r在U I控件上显示解析后的

!基金项目:广东省科技计划项目(2014B010124001,2016B030303011 );广东省教育厅研究生教育创新计划项目(2015JGXM-ZD14)数据。整个流程如图1所示。

在整个流程中,请求服务器并获取J S0N数据时,需 要用到一种网络通信框架—V o l l e y; A n d r o i d终端获取J S0N数据之后,解析J S0N数据时,需要用到J S0N

解析

技术;在A n d r o id开发中,耗时的操作!如请求服务器,从

数据库中读取数据等)都要在子线程中进行,而在一般情 况下,子线程中不能更新U I控件,因此,为了将解析后的 J S O N数据显示在U I控件上,还需要使用H a n d le r。

综上可知,在整个流程中,需要使用三大关键技术:

V o l le y、JSO N解析和 H a n d le r。

1.1 Volley

A n d r o id终端远程获取数据时,绝大部分都需要H T T P (超文本传输协议)来进行网络数据的交互。为了简化H T T P的通信操作,A n d r o id开发团队推出了 一种网络通信 架构一V o l le y。V o l l.简单易用,并且非常适合进行数

据量不大但通信频繁的网络操作%!]。

H T T P协议的请求方式有两种:G E T方式和P O S T方 式。下面首先介绍在V o l l.框架中,G E T方式的实现流

程。该流程如下所示:

(1 )下载v o lley, j a r,并导人到A n d r o id项目中。

(2)获取S e q u e s t Q u e u e对象,代码如下所示:

R equ est(^u eu e m Q u eu e _V o lle y. new R equ est(^u eu e

(c o n te x t);

(3 )创建S tr in g S e q u e s t对象,代码如下所示:

StringRequest stringRequest = new StringRequest ( url, new Response. Listener < String > ()-

@Override

public void onResponse( String re sp o n se)-

//服务器响应成功后执行的操作

1

1

new R esponse. ErrorListener()-

@Override

public void on ErorR esponse( VolleyError e r r o r)-

//服务器响应失败后执行的操作

S tr in g R e q u e s t的构造方法需要传人三个参数,第一个 参数就是服务器的U R L地址,第二个参数是服务器响应

成功的回调,第三个参数是服务器响应失败的回调。其 中,p u b lic void o n R e s p o n s e(String r e sp o n se)的参数 response 就是请求成功之后,从服务器中获取的响应值。

(4)将 S trin gR equ est 对象添加到 R e q u estQ u eu e 中,代 码如下:

m Q u e u e. add (strin g R e q u e st);

以上就是在V o l l e y框架中G E T方式的实现流程,P O S T方式的实现流程与G E T方式类似,只需把上述的第 三步做如下修改即可:

StringRequest stringRequest = new StringRequest ( Method.

P O S T,u rl,listener,e rro rL isten er)-

@Override

protected Map < String, String > getP aram s() throws AuthFail-ureError -

Map < String, String > map = new HashMap < String,String > ();

map. put( ” key”,” value”);

return map;

1

1

其中,listener和eirorListener分别是服务器响应成功和失败后的回调,m ap用来添加要提交给服务器的参数。

1.2 JSON 解析

JSON 的全称是 JavaScript Object Notation,它是一■种轻量级的数据交换格式,可以让人们很容易地进行阅读和编 写,同时也可以方便机器进行生成和解析。JSO N主要有 两种表示结构:对象和数组。

1.2.1 对象

对象结构以“i”开始,以“1”结束,中间部分由〇个或 多个以“,”分隔的“key(键):value(值)”对组成,其中键 是字符串,值可以是字符串、对象或数组等。语法结构如 下所示:

-

keyl : v a lu e l,

key2 : va lu e2,

1

1.2.2 数组

数组结构以“[”开始,以“]”结束,中间由〇或多个以 “,”分隔的值的列表组成。语法结构为:%v a lu e l,v lu e2,value3 ]。

1.2.3解析

在实际应用中,从服务器中获取的JSON数据的具体 形式千差万别,不过,解析思路基本一致。JSO N主要有两 种表示结构,这两种结构的解析思想是一样的。这里以 JSON对象为例,来说明JSON解析的方法。

如果要解析的响应值response是一个JSON对象,那 么首先可以用下面的代码获取一个JSONObject对象:JSONObject rootjson = new JSONObject(response);

然后用ro o tjso n调用对应的方法来获取想要的值。比如:如果要获取该JSON对象中的一个S trin g类型的键 值对“key”:“v lu e”的值,那么可以使用如下代码:String value= rootjson.get!S tring(“key”);

如果想获取该JSON对象中的其他类型的数据,参考 上述方法即可。

1.3 Handler

在A n d ro id开发中,耗时的操作(如请求服务器、数据 库的操作等)都需要在子线程中执行。但是A n d ro id中有 这样一个审计机制:当a c tiv ity完全展示(相当于activity

的生命周期执行到;S e=m e()方法)之后,系统会去检测

子线程中有没有更新U I控件(除S u r fa c e V i e w和Process

类之外)的内容,如果有,那么整个程序就不能正常运行。

因此网络请求的相关操作需要放到子线程中进行,但

是子线程中不能更新U I控件的内容,于是,就产生了矛

盾。解决这一矛盾的方法就是使用H a n d le r。

这里以更新T e x t V i e w控件的内容为例,来说明H a-

d l

e r的一般使用流程。该流程如下所示(假定已经创建了 —?个T e x tV iew对象t v):

(1)在主线程中创建一个H a n d le r对象,并重写其中 的h a n d le M e s s a g e方法,用来接收子线程中发来的消息,并

更新0的内容。代码如下所示:

private Handler handler = new H a n d le r!)-

public void handleMessage( android, os. Message m s g)-

String newData = ( String) msg. o b j;

tv. setText! n ew D ata);

1

1

(2)在子线程中获取M e s s a g e对象m s g,然后把要更新 到T e x t V i e w控件上的数据绑定给m Sg,最后通过H a n d ler

对象h a n d le r把m Sg发送到主线程。代码如下所示:new Thread! new Runnabl e()-

@Override

public void run ()-

Message msg = Messge. o bt a i n!);

msg. obj = newData ;

handler. se n d M e ssa g e!m sg);

1

1) . s t a r t!);

2实例

下面用一个实例来验证A n d r o i d终端远程获取解析

并显示J S O N数据的这种方法。在该例中,服务器中已保

存了工厂某台空调机的运行数据(已封装为J S O N格式),

A n d r i d终端直接获取解析并显示在U I控件上即可。

2.1请求网络

在A n d r o id应用程序的主线程中创建一个子线程,然

后在子线程中利用v i l e框架,使用G E T方式请求服务

器,获取J S O N数据。简洁起见,下面仅列出使用G E T方

式请求服务器的核心代码。

!1)子线程中请求服务器的核心代码:

V olleyConnection volleyConnection = new VolleyConnection!);

volleyConnection. volleyGet ! mContext, url, new VolleyManager

()-

@Override

public void getResponse! String r e s p o n s e)-

Message msg = Message, o b t a i n!);

//js o n P r o c e s s方法用来解析服务器的响应值! J S O N格式)

msg. obj = jsonProccss! resp o n se);

handler. sendM essage! m s g);

1

1);

! 2 ) V o lle y C o n n e c tio n类中的核心代码:

public void volleyG et! Context context, String url, final Volley-

Manager v o lle y M a n a g e r)-

RequestQueue mQueue = Volley. newRequestQueue ! con-text) ;

StringRequest stringRequest = new StringRequest u rl,new Response. Listener < String > !)-

@Override

public void onResponse! String r e s p o n s e)-

volleyManager. getResponse! response);

//通过回调的方法,获取响应值response 1

1

new Response. E rrorl.istener!)-

@Override

public void onErrorResponse! VolleyError v v lle y E r r o r)-volleyManager. getResponse! ” E R R O R” );

1

1);

m Queue@add! stringRequest) ;

1

2.2解析JS O N数据

从服务器中获取J S O N数据之后,就可以进行解析。解析J S O N数据的核心代码如下所示:

public static RootE?ean jsonProcess! String re sp o n se)-

RootE?ean rootE?ean = n e w R o o t B e a n!);

try -

JSONObject rootjson = n ew JSO N O bject! resp o n se);

rootBean. Status = rootjson. getint! ” Status” );

rootBean. Msg = rootjson. getString! ” M sg” );

t y-

JSONArray jso n A ra y= rootjson. getJSONArray!M D a t a");

DataBean dataBean = new D a ta B e a n!);

dataBean. DeviceNo = jsonArray. getJSONObject! 0).getString ! M De v i c e No");

dataBean. RoomNo = jsonArray. getJSONObject! 0 ).getString ! v R o o m N o v) ;

dataBean. Floor = jsonAiray. getJSONObject! 0 ).getString !"

F l o o r");

dataBean. WorlcStatias = jsonArray. getJSONObject ! 0 ).get-String! ” WorkStatus”);

dataBean. BeginTime = jsonArm y. getJSONObject ! 0 ).get-String! vB egin T im ev) ;

dataBean. Timing = jso n A ra y. getJSONObject! 0 ).get-String! ” Tim ing”);

dataBean. Model _jsonArray. getJSONObject ( 0 # . get-String( "M o d e l");

dataBean. ein d S T eed_getJSONObject ( " # . getString! ” e in d S p e e d”);

dataBean. eindD irection _jsonArray. getJSONObject!0). getString! '' e in d D ir e c tio n");

dataBean. Temperature _jso n A ra y. getJSONObject ( 0 ). getString! ” Temperature”);

dataBean. e〇rkerNo _jsonArray. getJSONObject ! 0 ). getString! ” e〇rkerNo”);

rootE>ean. dataList. add! dataBean);

//d a t a L i s t用来保存J S O N中的每一个d a ta数组 |catch ! JSONException e) j

rootBean. dataList _n u ll;

e. printStackTrace!);

return rootBean;

|catch ! JSONException e) j

e. printStackTrace!);

1

'r e t u r n nu l;

2.3 H a n d l e r更新 U l

在子线程中请求服务器,并对响应值进行J S O N解析 之后,要想在U I控件中显示解析后的数据,可以使用H a n d le r。利用H a n d l e r把解析后的J S O N数据更新到U I 控件上的核心代码如下所示$

private Handler handler _new H andler! ) j

public void handleM essage! Message m sg) j

SootBean rootBean _! RootE>ean) msg. obj ;

if! rootBean 2_null) j

if! rootBean. Status __l)j

tv_DeviccNo. setText! rootBean. dataList. get! 0) . D eviccN o);

tv_RoomNo. setText! rootBean. dataList. g e t!0) . Room No);

tv_Floor. setText! rootBean. dataList. g e t!0) . Floor);

t v_e〇rkStatus. setT ext! rootBean. dataList. g e t! 0).e〇rkSta-tus) ;

tv_BeginTime. setText ! rootBean. dataList . get ! 0 ) . Begin-Tim e) ;

tv_Timing. setText! rootBean. dataList. g e t!0) . Tim ing);

tv_M odel. setText! rootBean. dataList. g e t!0) . M odel);

tv _ein d S p e ed. setText ! rootBean. dataList . get ! 0 ) . e i n d-Speed) ;

tv_eindD irection . s etText! rootE>ean . dataList . get! 0 ) ?e in d D i-rection );

tv_ Temperature. setText! rootE>ean . dataList . g e t! 0 )? Tempera-ture) ;

t v_e〇rkerNo. setText! rootBean. dataList. g e t!0) . e〇rkerNo);

|else j

Toast . makeText ! getApplicationContext ! ),rootBean. M sg,Toast. L E N G T H_S H O R T). show!);

1

1else j Toast. makeText ! getApplicationContext !),"未获取到

数据2",Toast. L E N G T H_S H O R T). show!);

2.4结果展示

整个程序的运行结果如图!所示。

I 16训

J s o n V te w e r

设备编号:136582

车间编号:116

楼层编号:1楼

运行状态:正常

开始时间:2月20日09:00:00

定时:无

模式:自动

风速:低

风向:下

溫度(摄氏度):26

负责人编号:1605270612

图2程序运行结果

3结论

根据实验结果可以看出,整个方法是完全可行的。

J S O N的诸多优点使得它在实际的工程开发中得到了非常 广泛的应用,经过不断的发展和完善,V o l l e y和H a n d l e r的

综合性能已经非常卓越。因此,总体来说,上述的这种远程获取解析并显示J O N数据的方法是完全高效可行的。参考文献

[1]龚成莹,邢敬宏,胡银保.基于J S O N的A n d ro id移动终端与

P H P及M y S Q L数据通信[J].工业仪表与自动化装置,2013

! 1) :63-65.

[2]孟远.A n d r o id网络通信框架V o l le y的解析和比较[J].软

件,2014!12):66-68.

(收稿日期$2017-06-01)

作者简介:

赵鹏(1991 -),男,硕士,主要研究方向:A n d r o id医疗监护

系统。

骆德汉(1958 -),通信作者,男,博士,教授,主要研究方向:

机器仿真嗅觉/嗅觉传感技术,智能信息处理,绿色电子技术及

应用,网络控制系统集成,智能仪器与嵌入式系统。

梅领亮(1(73-),男,硕士,高级工程师,主要研究方向:光

机电一体化。

相关主题
文本预览
相关文档 最新文档