編輯:開發入門
簡介: 這個兩部分文章系列探索了在 android 平台上處理 Internet 上兩種最常見的數據格式 — XML 和 JavaScript Object Notation (JSON) — 的技術。第一部分介紹了 XML 和 JSON 的基礎概念,並展示了如何構建一個 android 應用程序,分析和顯示了這兩種格式的 Twitter 狀態更新 feed。
移動設備和平台吹噓每個新版本都有更多特性和功能,並且僅僅數月重要通告就從主流移動設備提供商中分離出來了。標題多數是關於 UI 特性(例如先進的多點觸摸功能和 Adobe® Flash® 技術)以及硬件提升(例如,處理器速度和存儲容量)。但是至關重要的仍然是 “內容為王”。內容 — 或者,一般來說,是數據 — 在應用程序、服務器、移動設備和用戶之間不停地被交換。智能手機,如 Apple 的 iPhone 和 Google 的 android 只是標價過高且表現不佳的移動電話,而且也不能很好的工作 。
考慮到社會網絡非比尋常的成功,例如:Facebook、LinkedIn 和 Twitter。單從特征和功能的角度來說,這些平台很大程度上都是單調的,之所以流行是因為會員和網站訪問者可以從其公布的內容獲益。而且,其內容逐漸可以通過移動設備訪問。
這篇文章主要說明 android 平台上 XML 和 JSON 數據交換格式的使用。對於一個 Twitter 帳戶,示例應用程序數據源是一個狀態更新 feed。Feed 數據可以以 XML 和 JSON 格式從 Twitter 上獲取。正如您所看到的,操作數據的程序設計方法在這兩種格式中明顯不同。
建議您安裝 android SDK version 1.5 或最新版以及 Eclipse 來運行本文附帶的 示例代碼。為了了解更多關於設置環境的知識,訪問 android Developers 網站。使用一個活動的帳戶跟著示例練習是很重要的,但不是必須的。相關鏈接見 參考資料。
首先我們來簡要的看一下這兩個數據格式,從 XML 開始。如果您對 XML 和 JSON 已經很熟悉了,就可以跳轉到 應用機會:Twitter feeds 在 android 上開始運行。
XML:一個老朋友
當您將 XML 與 XML 普遍應用之前的工藝水平進行比較時,XML 的自述特性是很清楚的。此外,數據交換練習包括繁瑣的數據描述文檔,通常是在一個文字處理器或電子表格應用程序中手工編寫的。這些文檔,通常稱為接口規范,描述了字段名、長度、分隔符、層次結構等等。用戶采用他們認為合適的實踐;最接近標准的是熟悉的逗號分隔值(CSV)模式,盡管 CSV 文件變化很大。如果您懷疑這一點,試著將一個 CSV 文件導入電子表格應用程序,並且注意所有可用選項。
事實上,近幾年來為企業、web 或移動市場編程的人都遇到過 XML,幾乎您見到的每個地方都有。
一個 XML 文檔有一個可辨認的結構:一系列可以隨意包含屬性和子元素的元素。每個有效的 XML 文件第一行都有這樣一個聲明:<?XML version="1.0" encoding="utf-8"?>
。後面的內容根據應用程序而定。XML 的好處就在於它的自述性。
XML 模式
盡管 XML 文檔是自述的,但也必須遵循一定的規則和指導方針,這就需要 XML 模式,它是一個描述特定 XML 文件結構的文檔。此類結構通常是冗長且復雜的。(值得爭議的是,XML 對 IT 領域最糟糕的貢獻是,當高度描述的數據結構這一理念成為時尚時導致了數據爆炸,且這種情況由於過去十年中磁盤存儲技術成本大幅降低而加劇。)
當這些大且復雜的文件變得更規范時,對程序員和分析員來說手工處理通常是不可能完成的。為了解決這個問題,XML 編輯器和驗證工具可以在文件和相關的任務管理方面給予幫助。例如,文檔和遺留格式轉換。
除了一般的文本數據,XML 過去常用於存儲二進制數據,通過一個稱為 CDATA
的特殊標記集合實現。一個 XML 文檔中的 CDATA
標記可能含有各種數據,包括其他標記文本,假設該文本本身不含有CDATA
。
通過使用 XML 作為一個結構來執行請求/響應查詢,這並不是 API 使用該功能的常用方式。響應數據經常包含一個包含在 CDATA
標記中的 XML 結構。例如,一個 API 調用可能使用一個姓氏 Mott
來請求一個客戶記錄。數據找到時,封裝到一個 XML 結構中並將其置於響應元素中,如 清單 1 所示:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <request> <query> <lastname>Mott</lastname> <maxhits>100</maxhits> </query> </request> <?XML version="1.0" encoding="UTF-8" standalone="yes"?> <response> <returncode>200</returncode> <query> <lastname>Mott</lastname> <hits>1</hits> </query> <data> <![CDATA[ <contact> <firstname>Troy</firstname> <lastname>Mott</lastname> <age>not telling</age> </contact> ]]> </data> </response>
工作空間中的 XML
今天,XML 是默認的、預定數據格式。盡管同一數據的其他格式也可用,但基於 XML 結構的可用性進行計劃是一種最安全的方式。
Enterprise Resource Planning (ERP) 包頻繁使用 XML 進行數據到任務的導入和導出。Internet 新聞網站經常將數據提供為 Really Simple Syndication (RSS) — 具有新聞閱讀軟件可以處理的預定義格式的 XML 文檔。甚至文字處理應用程序(例如 OpenOffice.org 和 Microsoft® Office)也使用 XML。
現在的 Microsoft Office 文件是 PKZIP 兼容的,含有多個 XML 文檔。 每個 XML 在第一行都有這個常見聲明。正如您在 清單 2 所看到的,閱讀這些屬性可能有點難:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <w:document xmlns:ve="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/Wordprocessingml/2006/main" xmlns:wne="http://schemas.microsoft.com/Office/word/2006/wordml"> <w:body><w:p w:rsidR="00B6337C" w:rsidRDefault="00663F0E"><w:r> <w:t xml:space="preserve">This is a sample </w:t></w:r><w:r w:rsidRPr="006906EA"><w:rPr><w:i/></w:rPr><w:t>Microsoft Word document</w:t></w:r><w:r><w:t xml:space="preserve"> used to </w:t></w:r><w:r w:rsidRPr="006906EA"><w:rPr><w:b/> <w:u w:val="single"/></w:rPr><w:t>demonstrate</w:t></w:r> <w:r><w:t xml:space="preserve"> some XML topics.</w:t></w:r> </w:p><w:p w:rsidR="00B14B2A" w:rsidRDefault="00B14B2A"/><w:p w:rsidR="00B14B2A"w:rsidRDefault="00B14B2A"><w:r><w:rPr> <w:noProof/></w:rPr><w:drawing><wp:inline distT="0" distB="0" distL="0" distR="0"><wp:extent cx="3276600" cy="3838575"/><wp:effectExtent l="19050" t="0" r="0" b="0"/><wp:docPr id="1" name="Picture 0" descr="frankableson.jpg"/><wp:cNvGraphicFramePr><a:graphicFrameLocks xmlns:a="http://schemas.openXMLformats.org/drawingml/2006/main" noChangeASPect="1"/></wp:cNvGraphicFramePr><a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"><a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture"><pic:pic xmlns:pic="http://schemas.openXMLformats.org/drawingml/2006/picture"> <pic:nvPicPr><pic:cNvPrid="0"name="frankableson.jpg"/><pic:cNvPicPr/> </pic:nvPicPr><pic:blipFill><a:blip r:embed="rId4" cstate="print"/><a:stretch><a:fillRect/></a:stretch> </pic:blipFill><pic:spPr><a:xfrm><a:off x="0" y="0"/> <a:ext cx="3276600" cy="3838575"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></pic:spPr></pic:pic> </a:graphicData></a:graphic></wp:inline></w:drawing> </w:r></w:p><w:p w:rsidR="00663F0E" w:rsidRDefault="00663F0E"/> <w:p w:rsidR="00CC16CE" w:rsidRDefault="00CC16CE"/><w:sectPr w:rsidR="00CC16CE" w:rsidSect="00B6337C"><w:pgSz w:w="12240" w:h="15840"/> <w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="720" w:footer="720" w:gutter="0"/><w:cols w:space="720"/><w:docGrid w:linePitch="360"/></w:sectPr></w:body></w:document>
XML 是自述的,但是並不意味著標記一定是容易理解的。這個虛構的示例展示了多個名稱空間的使用,多個名稱使得理解 XML 文件更有挑戰性,如果不使用專用工具就很難理解。
XML 隨處可見,但是對於 Android 程序員來說並不是一個明智的選擇,特別是,如果數據結構成為與 XML 結構伴隨著的數據爆炸的犧牲品。像 android 這樣通常在蜂窩數據網絡(cellular data network)上工作的資源受限平台不能存儲和解析大量 XML 數據。然而,如果特殊編程任務要求文本和二進制數據交換,那麼 XML 是一個可靠的選擇。
現在,讓我們看一看數據交換的另一個格式:JSON。
回頁首
JSON:網絡的新成員
越來越多的 Internet API 供應商提供 JSON 作為一種數據格式。JSON 在 AJax (Asynchronous JavaScript and XML) 網頁編程社區中享有盛名。Ajax 技術使 web 頁面可以動態地更新,只更新所選區域的數據而不用更新整個頁面。由於較少數據被傳送 — 更重要的是,因為較少的數據被解析且顯示在浏覽器窗口 — 使用 AJAX 的應用程序比起傳統 web 應用程序能夠提供一個更好的用戶體驗。事實上,一個結構良好的 AJax 應用程序可與智能或富客戶端應用程序相抗衡。
當 AJax 應用程序與 web 服務器交換數據時,經常需要某類數據的刷新,但不需要格式化。通常認為一個 web 服務器提供預格式化(preformatted)Html 是一個糟糕的實踐。相反的,一個格式良好的應用程序應該將數據內容發送到浏覽器並應用一個 Cascading Style Sheets (CSS) 文件來產生視覺效果,比如顏色和特殊字體。
假設應用程序想要請求 Mr. Mott.(這是我們虛構的)的聯系記錄,應用程序返回浏覽器的數據元素不止一個。它是如何包裝的呢?在清單 1 示例中,您可以使用一個簡單的請求/響應結構。這已經足夠了;然而它要求您解析來自服務器的每個響應、以某種結構(DOM)存儲數據,然後更新網頁內容。
還有一種選擇,您可以從服務器上返回一些 JavaScript,並用它來直接處理。以下是一個虛擬應用程序的樣例響應,對 Mott 查詢(http://<yourserver/app/searchcontact?Mott
)的響應。這個響應是一個 JavaScript 對象字符串表示 — 即 JSON 字符串(為了適應本文頁寬在這分成兩行):
[{"firstname":"Troy","lastname":"Mott","age":"don't ask!"},{"firstname":"Apple seed", "lastname":"Mott's","age":"99"}]
XML 以其冗長而著名,而 JSON 也因其難度而聞名。JSON 對象其構造是一個鍵 :值 對,對象元素之間用逗號隔開,每個對象被包含在一對大括號 {}
內。一組對象數組包含在一對方括號中。這是將數據行從一個數據庫發送到一個對象數組的一種常見方法。其中每個數組元素對應數據庫中的一行,每個對象屬性代表數據的一列。
清單 3 顯示了一個在 Html 頁面中使用這類對象的示例。為簡單起見,不包括服務器通信;相反,JSON 數據作為一個字符串變量serverresponse
提供。
<Html> <head> <script language="JavaScript"> var serverresponse = "[{\"firstname\":\"Troy\",\"lastname\":\"Mott\",\"age\":\"don't ask!\"},{\"firstname\":\"Apple seed\",\"lastname\":\"Mott's\",\"age\":\"99\"}]"; function updatepage() { var contacts = eval(serverresponse ); var i; var s = "Search Results:<br />"; for (i=0;i<contacts.length;i++) { s = s + contacts[i].firstname + " " + contacts[i].lastname + "'s age is ... " + contacts[i].age + "<br />"; } document.getElementById("target").innerHTML = s; } </script> </head> <body> <button onclick="updatepage();">Search for Mott</button><br /> <span id="target"> </span> </body> </Html>
注意,這個示例使用 JavaScript 函數 eval()
將字符串轉換成一個 JavaScript 數組。JSON 庫可以為執行該步驟提供更快更安全的方法,清單 3 中的方法並不是最佳實踐。在這只是提供了一個 JSON 對象,如何用於 AJax 應用程序的背景:JSON 結構可被客戶端代碼交換、解析和操作。
總的來說,JSON 是:
CDATA
對應模式。
在 清單 3 中,客戶端是一個運行客戶端腳本的 web 浏覽器。返回本文主題,接下來將研究在 android 應用程序中 XML 和 JSON 的使用。
回頁首
應用機會:Twitter feeds
Twitter 現在已經變成了一種國際力量,它提供的更新包羅萬象:從什麼人正在吃早飯,他們的孩子的球隊在棒球比賽中的表現這類瑣事,到封閉國家中的政治動亂的街頭新聞,器官移植實時報道等嚴肅話題。
要獲取一些 XML 和 JSON 文檔以用於本文附帶的 樣例代碼,最簡單的方法就是通過 URL http://twitter.com/statuses/user_timeline/userid.format,其中 userid 是您的 Twitter 用戶 ID,format 是您要的格式:XML 或 JSON。
您也可以直接在您的 Twitte 頁面上找到此頁的鏈接,如 圖 1 所示。在那裡可以看到您的 Twitter 用戶 ID。
完整的 feed 文件相當冗長,下面兩個清單只顯示 feed 的第一項(來自我的 Twitter 帳戶)。清單 4 包含以下 XML 片段:
<?XML version="1.0" encoding="UTF-8"?> <statuses type="array"> <status> <created_at>Thu Apr 29 05:25:29 +0000 2010</created_at> <id>13052369631</id> <text>Wrapping up new article on JSON for android programmers...</text> <source><a href="http://www.linkedin.com/"rel="nofollow"> LinkedIn</a></source> <truncated>false</truncated> <in_reply_to_status_id/> <in_reply_to_user_id/> <favorited>false</favorited> <in_reply_to_screen_name/> <user> <id>15221439</id> <name>fableson</name> <screen_name>fableson</screen_name> <location>Byram Township, NJ</location> <description/> <profile_image_url>http://a3.twimg.com/profile_images/260492935 /bookcover_normal.jpg</profile_image_url> <url>http://msiservices.com</url> <protected>false</protected> <followers_count>52</followers_count> <profile_background_color>9ae4e8 <profile_text_color>000000</profile_text_color> <profile_link_color>0000ff</profile_link_color> <profile_sidebar_fill_color>e0ff92 </profile_sidebar_fill_color> <profile_sidebar_border_color>87bc44 </profile_sidebar_border_color> <friends_count>10</friends_count> <created_at>Tue Jun 24 17:04:11 +0000 2008</created_at> <favourites_count>0</favourites_count> <utc_offset>-18000</utc_offset> <time_zone>Eastern Time (US & Canada)</time_zone> <profile_background_image_url>http://s.twimg.com/a/1272044617/ images/themes/theme1/bg.png</profile_background_image_url> <profile_background_tile>false</profile_background_tile> <notifications>false</notifications> <geo_enabled>false</geo_enabled> <verified>false</verifIEd> <following>false</following> <statuses_count>91</statuses_count> <lang>en</lang> <contributors_enabled>false</contributors_enabled> </user> <geo/> <coordinates/> <place/> <contributors/> </status> </statuses>
清單 5 是同一數據,這次是以 JSON 格式顯示:
[ {"in_reply_to_status_id":null, "favorited":false, "created_at":"Thu Apr 29 05:25:29 +0000 2010", "in_reply_to_screen_name":null, "geo":null, "source":"<a href=\"http://www.linkedin.com/\" rel=\"nofollow\ ">LinkedIn</a>", "contributors":null, "place":null, "truncated":false, "coordinates":null, "user": { "friends_count":10, "description":"", "lang":"en", "statuses_count":91, "time_zone":"Eastern Time (US & Canada)", "profile_link_color":"0000ff", "favourites_count":0, "created_at":"Tue Jun 24 17:04:11 +0000 2008", "contributors_enabled":false, "profile_sidebar_fill_color":"e0ff92", "following":null, "geo_enabled":false, "profile_background_image_url":"http://s.twimg.com/a/1272044617/images/themes /theme1/bg.png", "profile_image_url":"http://a3.twimg.com/profile_images/260492935 /bookcover_normal.jpg", "notifications":null, "profile_sidebar_border_color":"87bc44", "url":"http://msiservices.com", "verifIEd":false, "profile_background_tile":false, "screen_name":"fableson", "protected":false, "location":"Byram Township, NJ", "profile_background_color":"9ae4e8", "name":"fableson", "followers_count":52, "id":15221439, "utc_offset":-18000, "profile_text_color":"000000" }, "in_reply_to_user_id":null, "id":13052369631, "text":"Wrapping up new article on JSON for android programmers..."} ]
注意,在兩個清單中除了狀態更新外還有非常多附加數據。您只需要注意日期/時間,何時發布公告以及公告的內容。接下來,將向您展示解析該數據的 android 應用程序的相關部分。整個項目見 下載部分
本文將從Android官方網站的Activity生命周期結構圖講起,教我們弄清所有的生命周期函數的原理,用實例表現android Activity的生命周期結構。AD:
大家好,我是一個android的初學者,現把在極地星空學習的一些學習筆記發上來,我們共同學習一下。望對初學者的你我有所幫助。android學習有一段時間了,從今天開始,
創建內容提供器和 Google Maps 應用程序您已經看到了一個完整的應用程序示例,現在簡要討論一下更加復雜的應用程序。內容提供器和 Google Maps本教程中討
android開發平台是開放的平台,而位於四層框架頂端的應用開發,必然涉及到android組件。本文將為大家詳細介紹android組件。 組件(Component)