国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

一種基于JSON的Android終端遠程獲取解析數(shù)據(jù)的方法*

2017-11-20 01:44:34駱德漢梅領(lǐng)亮
關(guān)鍵詞:控件線程代碼

趙 鵬,駱德漢,梅領(lǐng)亮

(1.廣東工業(yè)大學(xué) 信息工程學(xué)院,廣東 廣州 510006; 2.廣東正業(yè)科技股份有限公司,廣東 東莞 523270)

一種基于JSON的Android終端遠程獲取解析數(shù)據(jù)的方法*

趙 鵬1,駱德漢1,梅領(lǐng)亮2

(1.廣東工業(yè)大學(xué) 信息工程學(xué)院,廣東 廣州510006;2.廣東正業(yè)科技股份有限公司,廣東 東莞523270)

JSON作為一種輕量級的數(shù)據(jù)交換格式,具有安全、快速、通用、數(shù)據(jù)通信量小等優(yōu)點,這些優(yōu)點使JSON成為理想的數(shù)據(jù)交換語言。Android移動終端對數(shù)據(jù)的遠程訪問量正飛速增長,對數(shù)據(jù)的遠程獲取方法也提出了更高的要求,而JSON的眾多優(yōu)點使之能很好地滿足這一要求。文章在Volley框架中使用GET方式遠程獲取JSON數(shù)據(jù),然后對JSON數(shù)據(jù)進行解析處理,最終通過Handler把處理后的數(shù)據(jù)更新到UI控件上,從而實現(xiàn)JSON數(shù)據(jù)在Android終端上的遠程獲取解析和顯示。

Android;JSON;Volley;Handler

0 引言

在眾多移動終端平臺中,Android平臺的市場占有率最高。由于移動終端無法進行海量數(shù)據(jù)的存儲和計算,因此大多數(shù)Android應(yīng)用都采用“客戶端”+“云端”的模式,該模式的關(guān)鍵就在于移動終端與服務(wù)器端的交互。移動終端與服務(wù)器端的交互日益頻繁,因此選擇一種數(shù)據(jù)通信量小、快速、安全、通用的數(shù)據(jù)通信方式就顯得尤為重要[1]。JSON作為一種輕量級的數(shù)據(jù)交換語言,具有安全、快速、通用、數(shù)據(jù)通信量小等特性,這讓JSON成為了理想的數(shù)據(jù)通信方式。

1 關(guān)鍵技術(shù)

Android終端遠程獲取解析JSON數(shù)據(jù)并顯示的主要流程是:開啟子線程,請求服務(wù)器,服務(wù)器對請求進行處理并做出響應(yīng),子線程接收響應(yīng),獲取JSON數(shù)據(jù),然后對數(shù)據(jù)進行解析,最后通過Handler在UI控件上顯示解析后的數(shù)據(jù)。整個流程如圖1所示。

圖1 流程圖

在整個流程中,請求服務(wù)器并獲取JSON數(shù)據(jù)時,需要用到一種網(wǎng)絡(luò)通信框架——Volley;Android終端獲取JSON數(shù)據(jù)之后,解析JSON數(shù)據(jù)時,需要用到JSON解析技術(shù);在Android開發(fā)中,耗時的操作(如請求服務(wù)器,從數(shù)據(jù)庫中讀取數(shù)據(jù)等)都要在子線程中進行,而在一般情況下,子線程中不能更新UI控件,因此,為了將解析后的JSON數(shù)據(jù)顯示在UI控件上,還需要使用Handler。

綜上可知,在整個流程中,需要使用三大關(guān)鍵技術(shù):Volley、JSON解析和Handler。

1.1Volley

Android終端遠程獲取數(shù)據(jù)時,絕大部分都需要HTTP(超文本傳輸協(xié)議)來進行網(wǎng)絡(luò)數(shù)據(jù)的交互。為了簡化HTTP的通信操作,Android開發(fā)團隊推出了一種網(wǎng)絡(luò)通信架構(gòu)——Volley。Volley簡單易用,并且非常適合進行數(shù)據(jù)量不大但通信頻繁的網(wǎng)絡(luò)操作[2]。

HTTP協(xié)議的請求方式有兩種:GET方式和POST方式。下面首先介紹在Volley框架中,GET方式的實現(xiàn)流程。該流程如下所示:

(1)下載volley.jar,并導(dǎo)入到Android項目中。

(2)獲取RequestQueue對象,代碼如下所示:

RequestQueue mQueue = Volley.newRequestQueue(context);

(3)創(chuàng)建StringRequest對象,代碼如下所示:

StringRequest stringRequest = new StringRequest(url,new Response.Listener(){

@Override

public void onResponse(String response){

//服務(wù)器響應(yīng)成功后執(zhí)行的操作

}

}

new Response.ErrorListener(){

@Override

public void onErrorResponse(VolleyError error){

//服務(wù)器響應(yīng)失敗后執(zhí)行的操作

}

});

StringRequest的構(gòu)造方法需要傳入三個參數(shù),第一個參數(shù)就是服務(wù)器的URL地址,第二個參數(shù)是服務(wù)器響應(yīng)成功的回調(diào),第三個參數(shù)是服務(wù)器響應(yīng)失敗的回調(diào)。其中,public void onResponse(String response)的參數(shù)response就是請求成功之后,從服務(wù)器中獲取的響應(yīng)值。

(4)將StringRequest對象添加到RequestQueue中,代碼如下:

mQueue.add(stringRequest);

以上就是在Volley框架中GET方式的實現(xiàn)流程,POST方式的實現(xiàn)流程與GET方式類似,只需把上述的第三步做如下修改即可:

StringRequest stringRequest = new StringRequest(Method.POST,url,listener,errorListener) {

@Override

protected Map getParams() throws AuthFailureError {

Map map = new HashMap();

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

return map;

}

}

其中,listener和errorListener分別是服務(wù)器響應(yīng)成功和失敗后的回調(diào),map用來添加要提交給服務(wù)器的參數(shù)。

1.2JSON解析

JSON的全稱是JavaScript Object Notation,它是一種輕量級的數(shù)據(jù)交換格式,可以讓人們很容易地進行閱讀和編寫,同時也可以方便機器進行生成和解析。JSON主要有兩種表示結(jié)構(gòu):對象和數(shù)組。

1.2.1對象

對象結(jié)構(gòu)以“{”開始,以“}”結(jié)束,中間部分由0個或多個以“,”分隔的“key(鍵):value(值)”對組成,其中鍵是字符串,值可以是字符串、對象或數(shù)組等。語法結(jié)構(gòu)如下所示:

{

key1:value1,

key2:value2,

}

1.2.2數(shù)組

數(shù)組結(jié)構(gòu)以“[”開始,以“]”結(jié)束,中間由0或多個以“,”分隔的值的列表組成。語法結(jié)構(gòu)為:[value1,value2,value3]。

1.2.3解析

在實際應(yīng)用中,從服務(wù)器中獲取的JSON數(shù)據(jù)的具體形式千差萬別,不過,解析思路基本一致。JSON主要有兩種表示結(jié)構(gòu),這兩種結(jié)構(gòu)的解析思想是一樣的。這里以JSON對象為例,來說明JSON解析的方法。

如果要解析的響應(yīng)值response是一個JSON對象,那么首先可以用下面的代碼獲取一個JSONObject對象:

JSONObject rootJson=new JSONObject(response);

然后用rootJson調(diào)用對應(yīng)的方法來獲取想要的值。比如:如果要獲取該JSON對象中的一個String類型的鍵值對“key”:“value”的值,那么可以使用如下代碼:

String value=rootJson.getString(“key”);

如果想獲取該JSON對象中的其他類型的數(shù)據(jù),參考上述方法即可。

1.3Handler

在Android開發(fā)中,耗時的操作(如請求服務(wù)器、數(shù)據(jù)庫的操作等)都需要在子線程中執(zhí)行。但是Android中有這樣一個審計機制:當(dāng)activity完全展示(相當(dāng)于activity的生命周期執(zhí)行到onResume()方法)之后,系統(tǒng)會去檢測子線程中有沒有更新UI控件(除SurfaceView和Process類之外)的內(nèi)容,如果有,那么整個程序就不能正常運行。

因此網(wǎng)絡(luò)請求的相關(guān)操作需要放到子線程中進行,但是子線程中不能更新UI控件的內(nèi)容,于是,就產(chǎn)生了矛盾。解決這一矛盾的方法就是使用Handler。

這里以更新TextView控件的內(nèi)容為例,來說明Handler的一般使用流程。該流程如下所示(假定已經(jīng)創(chuàng)建了一個TextView對象tv):

(1)在主線程中創(chuàng)建一個Handler對象,并重寫其中的handleMessage方法,用來接收子線程中發(fā)來的消息,并更新tv的內(nèi)容。代碼如下所示:

private Handler handler = new Handler(){

public void handleMessage(android.os.Message msg){

String newData = (String)msg.obj;

tv.setText(newData);

}

}

(2)在子線程中獲取Message對象msg,然后把要更新到TextView控件上的數(shù)據(jù)綁定給msg,最后通過Handler對象handler 把msg發(fā)送到主線程。代碼如下所示:

new Thread(new Runnable() {

@Override

public void run() {

Message msg = Messge.obtain();

msg.obj = newData;

handler.sendMessage(msg);

}

}).start();

2 實例

下面用一個實例來驗證Android終端遠程獲取解析并顯示JSON數(shù)據(jù)的這種方法。在該例中,服務(wù)器中已保存了工廠某臺空調(diào)機的運行數(shù)據(jù)(已封裝為JSON格式),Android終端直接獲取解析并顯示在UI控件上即可。

2.1請求網(wǎng)絡(luò)

在Android應(yīng)用程序的主線程中創(chuàng)建一個子線程,然后在子線程中利用volley框架,使用GET方式請求服務(wù)器,獲取JSON數(shù)據(jù)。簡潔起見,下面僅列出使用GET方式請求服務(wù)器的核心代碼。

(1)子線程中請求服務(wù)器的核心代碼:

VolleyConnection volleyConnection = new VolleyConnection();

volleyConnection.volleyGet(mContext,url,new VolleyManager() {

@Override

public void getResponse(String response) {

Message msg = Message.obtain();

//jsonProcess方法用來解析服務(wù)器的響應(yīng)值(JSON格式)

msg.obj = jsonProcess(response);

handler.sendMessage(msg);

}

});

(2)VolleyConnection類中的核心代碼:

public void volleyGet(Context context,String url,final VolleyManager volleyManager) {

RequestQueue mQueue = Volley.newRequestQueue(context);

StringRequest stringRequest = new StringRequest(url,new Response.Listener() {

@Override

public void onResponse(String response) {

volleyManager.getResponse(response);

//通過回調(diào)的方法,獲取響應(yīng)值response

}

}

new Response.ErrorListener() {

@Override

public void onErrorResponse(VolleyError volleyError) {

volleyManager.getResponse("ERROR");

}

});

mQueue.add(stringRequest);

}

2.2解析JSON數(shù)據(jù)

從服務(wù)器中獲取JSON數(shù)據(jù)之后,就可以進行解析。解析JSON數(shù)據(jù)的核心代碼如下所示:

public static RootBean jsonProcess(String response){

RootBean rootBean = new RootBean();

try {

JSONObject rootJson = new JSONObject(response);

rootBean.Status = rootJson.getInt("Status");

rootBean.Msg = rootJson.getString("Msg");

try {

JSONArray jsonArray = rootJson.getJSONArray("Data");

DataBean dataBean = new DataBean();

dataBean.DeviceNo = jsonArray.getJSONObject(0).getString("DeviceNo");

dataBean.RoomNo = jsonArray.getJSONObject(0).getString("RoomNo");

dataBean.Floor= jsonArray.getJSONObject(0).getString("Floor");

dataBean.WorkStatus = jsonArray.getJSONObject(0).getString("WorkStatus");

dataBean.BeginTime = jsonArray.getJSONObject(0).getString("BeginTime");

dataBean.Timing = jsonArray.getJSONObject(0).getString("Timing");

dataBean.Model = jsonArray.getJSONObject(0).getString("Model");

dataBean.WindSpeed = jsonArray.getJSONObject(0).getString("WindSpeed");

dataBean.WindDirection = jsonArray.getJSONObject(0).getString("WindDirection");

dataBean.Temperature = jsonArray.getJSONObject(0).getString("Temperature");

dataBean.WorkerNo = jsonArray.getJSONObject(0).getString("WorkerNo");

rootBean.dataList.add(dataBean);

//dataList用來保存JSON中的每一個data數(shù)組

}catch (JSONException e){

rootBean.dataList = null;

e.printStackTrace();

}

return rootBean;

} catch (JSONException e) {

e.printStackTrace();

}

return null;

}

2.3Handler更新UI

在子線程中請求服務(wù)器,并對響應(yīng)值進行JSON解析之后,要想在UI控件中顯示解析后的數(shù)據(jù),可以使用Handler。利用Handler把解析后的JSON數(shù)據(jù)更新到UI控件上的核心代碼如下所示:

private Handler handler = new Handler() {

public void handleMessage(Message msg) {

RootBean rootBean = (RootBean) msg.obj;

if(rootBean != null){

if(rootBean.Status == 1){

tv_DeviceNo.setText(rootBean.dataList.get(0).DeviceNo);

tv_RoomNo.setText(rootBean.dataList.get(0).RoomNo);

tv_Floor.setText(rootBean.dataList.get(0).Floor);

tv_WorkStatus.setText(rootBean.dataList.get(0).WorkStatus);

tv_BeginTime.setText(rootBean.dataList.get(0).BeginTime);

tv_Timing.setText(rootBean.dataList.get(0).Timing);

tv_Model.setText(rootBean.dataList.get(0).Model);

tv_WindSpeed.setText(rootBean.dataList.get(0).WindSpeed);

tv_WindDirection.setText(rootBean.dataList.get(0).WindDirection);

tv_Temperature.setText(rootBean.dataList.get(0).Temperature);

tv_WorkerNo.setText(rootBean.dataList.get(0).WorkerNo);

}else{

Toast.makeText(getApplicationContext(),rootBean.Msg,Toast.LENGTH_SHORT).show();

}

}else{Toast.makeText(getApplicationContext(),"未獲取到數(shù)據(jù)!",Toast.LENGTH_SHORT).show();

}

}

}

2.4結(jié)果展示

整個程序的運行結(jié)果如圖2所示。

圖2 程序運行結(jié)果

3 結(jié)論

根據(jù)實驗結(jié)果可以看出,整個方法是完全可行的。JSON的諸多優(yōu)點使得它在實際的工程開發(fā)中得到了非常廣泛的應(yīng)用,經(jīng)過不斷的發(fā)展和完善,Volley和Handler的綜合性能已經(jīng)非常卓越。因此,總體來說,上述的這種遠程獲取解析并顯示JSON數(shù)據(jù)的方法是完全高效可行的。

[1] 龔成瑩,邢敬宏,胡銀保.基于JSON的Android移動終端與PHP及MySQL數(shù)據(jù)通信[J].工業(yè)儀表與自動化裝置,2013(1):63-65.

[2] 孟遠.Android網(wǎng)絡(luò)通信框架Volley的解析和比較[J].軟件,2014(12):66-68.

A method of obtaining and resolving data remotely on Android terminal based on JSON

Zhao Peng1, Luo Dehan1, Mei Lingliang2

(1.Information Engineering Institute,Guangdong University of Technology,Guangzhou 510006,China;2.Guangdong Zhengye Technology Stock Limited Company,Dongguan 523270,China)

As a lightweight data-interchange format,JSON has a lot of advantages,such as safe,fast,global,and small data traffic.Just because of those excellent merits,JSON becomes an ideal data-interchange language.The remote access traffic of data of Android mobile terminal is increasing in a very fast speed ,and it puts forward higher requirements to the method of remote access of data.The wonderful virtues of JSON make itself meets those requirements perfectly.In this paper,we use the method of GET in Volley communication framework to obtain JSON data remotely.Then,to resolve and handle JSON data,and update the handled JSON data to the widgets of UI finally though handler.By this way,we can obtain JSON data remotely,resolve it efficiently,and display it on Android mobile terminal easily.

Android; JSON; Volley; Handler

TP391.1

A

10.19358/j.issn.1674-7720.2017.21.018

趙鵬,駱德漢,梅領(lǐng)亮.一種基于JSON的Android終端遠程獲取解析數(shù)據(jù)的方法J.微型機與應(yīng)用,2017,36(21):57-60.

廣東省科技計劃項目(2014B010124001,2016B030303011);廣東省教育廳研究生教育創(chuàng)新計劃項目(2015JGXM-ZD14)

2017-06-01)

趙鵬(1991-),男,碩士,主要研究方向:Android醫(yī)療監(jiān)護系統(tǒng)。

駱德漢(1958-),通信作者,男,博士,教授,主要研究方向:機器仿真嗅覺/嗅覺傳感技術(shù),智能信息處理,綠色電子技術(shù)及應(yīng)用,網(wǎng)絡(luò)控制系統(tǒng)集成,智能儀器與嵌入式系統(tǒng)。

梅領(lǐng)亮(1973-),男,碩士,高級工程師,主要研究方向:光機電一體化。

猜你喜歡
控件線程代碼
創(chuàng)世代碼
動漫星空(2018年11期)2018-10-26 02:24:02
創(chuàng)世代碼
動漫星空(2018年2期)2018-10-26 02:11:00
創(chuàng)世代碼
動漫星空(2018年9期)2018-10-26 01:16:48
創(chuàng)世代碼
動漫星空(2018年5期)2018-10-26 01:15:02
關(guān)于.net控件數(shù)組的探討
軟件(2018年7期)2018-08-13 09:44:42
淺談linux多線程協(xié)作
Linux線程實現(xiàn)技術(shù)研究
就這樣玩會VBA中常見的自定義控件
電腦迷(2012年24期)2012-04-29 00:44:03
么移動中間件線程池并發(fā)機制優(yōu)化改進
在PowerBuUder中利用WinSock控件制作簡單的Web服務(wù)器
常山县| 沁源县| 冀州市| 遵化市| 澄迈县| 屏山县| 双城市| 精河县| 大丰市| 武功县| 恭城| 永济市| 仙居县| 万山特区| 永年县| 大庆市| 涞水县| 阜城县| 基隆市| 台东市| 彩票| 大理市| 江北区| 乐陵市| 隆尧县| 连州市| 大余县| 中阳县| 洞口县| 天峻县| 光泽县| 日土县| 银川市| 肇州县| 洞口县| 麻城市| 皋兰县| 桃园县| 贵州省| 万安县| 长子县|