Android高效入門-讀取JSON資料與okHttp

By | 2016-05-15

讀取並解析JSON資料

當Android應用程式連線到網路上的服務讀取資料時,並不像先前的登入範例讀取一個字元這麼簡單,在實務上,讀取更多的文字資料如網頁原始碼、XML或JSON格式等,與伺服器連線後使用的通訊協定大都是網頁HTTP協定。

使用Java語言讀取網路HTTP協定的資料大都使用java.io.BufferedReader類別,再以readLine方法在迴圈中收集所有資料,這些設計目的都是取得一個網址的連線,若能用更簡短、有效率的方式能快速取得資料的字串,再進行解析、處理,能夠加快開發速度。

本篇先使用一般的方式取得網址回應的資料,資料為目前的主流JSON格式,先使用內建的JSON.org類別庫解析資料後,在下一篇文章,再更換使用第三方函式庫GsonJackson進行資料的解析並使用Material Design實感設計所推出的新版清單元件RecyclerView類別,以清單的方式展示已取得的資料。

讀取JSON資料

JSON資料格式是一種輕量級的資料交換格式,以文字為基礎、易於閱讀,全名為「JavaScript Object Notation」,它原是在Javascript中表示資料的一種格式,但目前大量使用在各類程式語言中,用來表示資料或提供資料的格式。

請使用瀏覽器開啟以下網址進行測試。

網址: http://atm201605.appspot.com/h

A5104

這是一個JSON格式的測試網址,模擬一個伺服器提供交易資料明細,有五筆交易資料。

  • JSON陣列

用來表示多筆資料,以程式語言的陣列來看,它含有一筆以上的資料,資料間用逗號分隔,並以中括號集合多筆資料成為一個陣列,如下:

[物件1, 物件2, 物件3, … ]

  • JSON物件

用以表示一筆資料,資料中的每個欄位名稱以冒號表示它的值,並以大括號集合所有欄位成為一個物件,如下:

{欄位名稱:欄位值 , 欄位名稱:欄位值 , … }

以下是一筆交易JSON物件的範例:

{“account":"jack","date":"20160501″,"amount":1500,"type":0}

資料的意義如下:

欄位名稱說明
accountjack帳號名稱
date20150501交易日期
amount1500交易金額
type0交易類型

取得伺服端傳來回應

使用AsyncTask類別設計HTTP連線工作,讀取完成後回傳字串結果,在TransActivity內設計一內部類別TransTask,並繼承AsyncTask,在doInBackground設計連線並讀取伺服器傳來回應的所有字串,程式碼如下:

接下來請再覆寫TransTask內的onPostExecute方法,接收doInBackground最後return回值的字串,進行後續解析工作,如下:

第5-10行,覆寫的onPostExecute方法,在doInBackground方法執行完成後自動執行的方法。

第8行,使用Log類別印出除錯訊息

第9行,呼叫自行設計的parseJSON方法,並傳入從網頁讀取的字串資料。

第13-14行,自行設計的方法,為了解析JSON資料而建立。

以上是連線網路並讀取資料的設計過程,必須設計AsyncTask類別、實作方法、建立網路連線、讀取並收集資料等,這樣的任務實在繁複。如果應用程式中經常需要這類的工作設計時,有無方法可以簡化呢?

第三方類別庫

由於開放原始碼的盛行,有許多專案都提供這類的函式庫,可加快開發速度,簡化繁雜的工作。例如網路連線常用的okHttp、Volley,JSON解析使用Gson或Jackson類別庫。

Gradle設定檔

Android Studio的每一個模組(Module)可以擁有自己的設定檔,而一個專案可以擁有多個模組,設計Android應用程式時就是自動產生個名為「app」的模組。設定檔檔名統一為「build.gradle」,它是一個使用Groovy語法的純文字檔案,記錄這個模組如何編譯、包裝、執行等工作,若模組使用到外來的函式庫也在此檔中加入。一般來說,我們通常只需要修改app模組的build.gradle,如下圖:

A5112

在模組中使用JDK與Android SDK以外的函式庫前,必須在Gradle的設定檔「build.gradle」中設定,請展開專案區的「Gradle Scripts」,點擊開啟「build.gradle(Module:app)」,檔案如下:

分別就三個區塊說明如下:

1. 外掛宣告區

在檔案開頭的描述:

代表宣告在這個檔案中使用Gradle的Android外掛(plugin),Gradle工具已設計了Android開發過程中會使用的工作,這些工作就稱為Android外掛,只要在第一行宣告後,在後續的內容中就可以使用android{ … }這樣的區塊來自定這個模組的設定與資訊。

2, android設定宣告區

有了Android外掛的宣告後,就可使用android區塊來定義模組的資訊,如下:

第2行,定義本模組是以API Level 23做為開發環境

第3行,編譯、建置工具的版本為24.0.0

第5-11行,本模組的預設資訊defaultConfig子區塊,有應用程式的套件名稱、最小需求安裝的Android版本,目標對象的Android版本,與本應用程式的版號與版名。

第12-17行,本模組在建置(打包)時的子設定區塊buildTypes,其中設定了release建置,代表發行時的建置工作設定。

3. 相依性函式庫

第三個部份是dependencies相依性區塊,模組若使用了外來的函式庫(類別庫)時,需在這個區塊中定義,在編譯時需要處理的函式庫使用「compile」命令加入,如下:

第2行,編譯時加入檔案系統中的libs資料夾中的所有副檔名為*.jar的檔案。

第3行,在測試時才加入’junit:junit:4.12’函式庫

第4-5行,編譯時需加入兩個函式庫

使用OkHttp第三方函式庫

OkHttp是一個網路的應用程式框架,可使用它快速實作資料交換的工作,讓HTTP連線的過程更加有效率,能避免人為的錯誤設計,加快程式執行的速度。

官方網址為:

http://square.github.io/okhttp/

OkHttp的特色為:

  • 支援HTTP/2,讓連到一個主機的多個要求都能共用一個socket通道
  • 使用連接池(Connection Pool)以降低產生要求時的延遲時間
  • 使用GZIP壓縮技術降低下載的資料大小
  • 回應的快取機制以避免多次連至同一網址時的負荷

 1. 專案導入OkHttp函式庫

請打開專案中的「build.gradle(Module:app)」,在最下方的dependencies區塊中加入OkHttp的函式庫名稱與版本,如下:

每次修改過build.gradle都需要進行同步的工作,請按上方功能圖示的「Sync Project with Gradle Files」,如下圖:

A5113

或點擊功能表的「Tools/Android/ Sync Project with Gradle Files」,此時會進行函式庫檢查,或本機之前並無此函式庫,會自動連至網路上下載回來,放置在使用者家目錄下的「.gradle」資料夾。

2. 使用OkHttp類別完成工作

接著將在TransActivity類別中進行程式設計,使用OkHttp提供的類別進行HTTP連線並取得回應字串,以下範例需要import的語法

一開始請先加入OkHttpClient類別的屬性,它提供HTTP網路連線的能力,如下:

接下來請在onCreate方法中實作連線程式碼,如下:

第4-6行,使用Request.Builder設定一個連線必要的資訊,如網址則使用url()方法定義,完成後再呼叫build方法即產生HTTP的請求(Request),此時還未連線至主機。

第7行,使用OkHttpClient的newCall方法建立一個呼叫物件,此時仍然尚未連線至主機。

第8行,呼叫Call類別的enqueue方法,進行排程連線,此時才實際連至主機,並在方法中準備一個回報的物件,當連線至主機的工作完成後依照成功與否自動呼叫onResponse(成功回應)或是onFailure(失敗)方法。

第11行,取得伺服器的回應字串。

第12行,輸出除錯訊息。

第14行,執行自行定義的parseJSON方法,傳入連線後伺服器的回應資料。

執行後,成功讀取到測試網址的伺服器回應字串,如下:

A5107

使用OkHttp這類的框架,可以簡化需先設計AsyncTask、覆寫方法、繁複的URL、輸出入迴圈或是設計多執行緒等工作,讓開發人員可以專注在程式的流程與方法,加快開發的速度與效率。

相關文章:

Category: Android 網路程式 標籤:, , ,

About Hank Tom

專長為程式語言、雲端服務開發,Linux系統管理, 任職:利拓科技 技術長,海林行動科技 技術總監 輔仁大學 兼任助理教授 ,為 Android高效入門>深度學習、CentOS 7建置、管理與伺服器架設實戰、Java網路程式設計、雲端網頁程式設計-Google App Engine應用實作 等書作者

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *