亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

        2017-11-20 01:44:34駱德漢梅領(lǐng)亮

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

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

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

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

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

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

        Android;JSON;Volley;Handler

        0 引言

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

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

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

        圖1 流程圖

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

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

        1.1Volley

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

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

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

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

        RequestQueue mQueue = Volley.newRequestQueue(context);

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

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

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

        mQueue.add(stringRequest);

        以上就是在Volley框架中GET方式的實(shí)現(xiàn)流程,POST方式的實(shí)現(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,它是一種輕量級(jí)的數(shù)據(jù)交換格式,可以讓人們很容易地進(jìn)行閱讀和編寫,同時(shí)也可以方便機(jī)器進(jìn)行生成和解析。JSON主要有兩種表示結(jié)構(gòu):對(duì)象和數(shù)組。

        1.2.1對(duì)象

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

        {

        key1:value1,

        key2:value2,

        }

        1.2.2數(shù)組

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

        1.2.3解析

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

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

        JSONObject rootJson=new JSONObject(response);

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

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

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

        1.3Handler

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

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

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

        (1)在主線程中創(chuàng)建一個(gè)Handler對(duì)象,并重寫其中的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對(duì)象msg,然后把要更新到TextView控件上的數(shù)據(jù)綁定給msg,最后通過Handler對(duì)象handler 把msg發(fā)送到主線程。代碼如下所示:

        new Thread(new Runnable() {

        @Override

        public void run() {

        Message msg = Messge.obtain();

        msg.obj = newData;

        handler.sendMessage(msg);

        }

        }).start();

        2 實(shí)例

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

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

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

        (1)子線程中請(qǐng)求服務(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ù)之后,就可以進(jìn)行解析。解析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中的每一個(gè)data數(shù)組

        }catch (JSONException e){

        rootBean.dataList = null;

        e.printStackTrace();

        }

        return rootBean;

        } catch (JSONException e) {

        e.printStackTrace();

        }

        return null;

        }

        2.3Handler更新UI

        在子線程中請(qǐng)求服務(wù)器,并對(duì)響應(yīng)值進(jìn)行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é)果展示

        整個(gè)程序的運(yùn)行結(jié)果如圖2所示。

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

        3 結(jié)論

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

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

        [2] 孟遠(yuǎn).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終端遠(yuǎn)程獲取解析數(shù)據(jù)的方法J.微型機(jī)與應(yīng)用,2017,36(21):57-60.

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

        2017-06-01)

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

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

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

        欧美日韩精品乱国产538| 欧美国产激情18| 国产成人无码精品久久二区三区| 午夜福利视频合集1000| 国产精品一区2区三区| 日韩亚洲精选一区二区三区| 在线观看av网站永久| 精品免费看国产一区二区| 久久久亚洲欧洲日产国产成人无码 | 国产在线精彩自拍视频| 日本人妻伦理在线播放| 97精品一区二区视频在线观看| 无码不卡高清毛片免费| 狼人av在线免费观看| 日本免费在线不卡一区二区| 亚洲精品午夜无码专区| aaa毛片视频免费观看| 日本精品熟妇一区二区三区| 国产毛片av最新视频| 无码人妻久久一区二区三区不卡| 亚洲区日韩精品中文字幕| 日本一区二区三区在线观看视频| 97丨九色丨国产人妻熟女| 大陆极品少妇内射aaaaa| 亚洲中文久久久久无码| 色视频不卡一区二区三区| a级国产乱理伦片| 国产主播一区二区三区在线观看 | 一区二区三区午夜视频在线| 少妇被粗大的猛烈进出69影院一| 亚洲羞羞视频| 国产女人高潮的av毛片| 亚洲夫妻性生活免费视频| 明星性猛交ⅹxxx乱大交| 久草热这里只有精品在线| 国产自拍视频免费在线观看| 亚洲欧美牲交| 91av在线播放| 综合图区亚洲偷自拍熟女| 久久99亚洲精品久久久久 | 蜜桃视频一区二区三区在线观看|