這是我們為大家提供的一篇介紹在 Android 上使用 XML是如何進行的的文章,接下來就讓我們一起來了解一下吧!
簡介: Android 是針對移動設備的一種新興的開源操作系統和 SDK。借助它,您可以創建功能強大的移動應用程序。當您的應用程序可以訪問 Web 服務時,其吸引力會大大增加,這意味著您需要使用 Web 語言:XML。在本文中,您將了解在 Android 上使用 XML 的不同方法,以及如何使用它們構建自己的 Android 應用程序。
入門
在本文中,您將學習如何構建通過 Internet 使用 XML 的 Android 應用程序。Android 應用程序是使用 Java™ 編程語言編寫的,因此具備 Java 技術方面的經驗是必需的。要進行 Android 開發,您需要使用 Android SDK。本文中的所有代碼適用於任何版本的 Android SDK,但 SDK 1.5_pre 是用於開發代碼的。您可以使用 SDK 和一個文本編輯器來開發 Android 應用程序,但使用 Android Developer Tools (ADT)(一款 Eclipse 插件)會更加簡單。在本文中,我們使用 0.9 版本的 ADT 和 Eclipse 3.4.2, Java 版本。有關所有這些工具的鏈接,請參見 參考資料。
Android 上的 XML
Android 平台是一個開源移動開發平台。它允許您訪問各種移動設備的所有方面,這些移動設備從低級圖形設備到手機攝像頭上的硬件不一而足。由於 Android 可以實現這麼豐富的功能,因此您可能想知道為何還要為 XML 傷腦筋呢。並不是因為使用 XML 是多麼地有趣;而是因為它能提供一些特殊的支持。XML 經常用作 Internet 上的一種數據格式。如果您希望通過 Internet 訪問數據,則數據很有可能是 XML 格式。如果您希望發送數據給 Web 服務,那麼您可能也需要發送 XML。簡而言之,如果您的 Android 應用程序將利用 Internet,那麼您可能需要使用 XML。幸運的是,您可以采用多種方法在 Android 上使用 XML。
XML 解析器
常用縮略語
API:應用程序編程接口(Application programming interface)
RSS:Really Simple Syndication
SDK:軟件開發包(Software Developers Kit)
UI:用戶界面(User interface)
URL:通用資源定位符(Universal Resource Locator)
XML:可擴展標記語言(Extensible Markup Language)
Android 平台最大的一個優勢在於它利用了 Java 編程語言。Android SDK 並未向您的標准 Java Runtime Environment (JRE) 提供一切可用功能,但它支持其中很大一部分功能。Java 平台支持通過許多不同的方式來使用 XML,並且大多數與 XML 相關的 Java API 在 Android 上得到了完全支持。舉例來說,Java 的 Simple API for XML (SAX) 和 Document Object Model (DOM) 在 Android 上都是可用的。這些 API 多年以來一直都是 Java 技術的一部分。較新的 Streaming API for XML (StAX) 在 Android 中並不可用。但是, Android 提供了一個功能相當的庫。最後,Java XML Binding API 在 Android 中也不可用。這個 API 已確定可以在 Android 中實現。但是,它更傾向於是一個重量級的 API,需要使用許多不同類的實例來表示 XML 文檔。因此,這對於受限的環境,比如說 Android 針對的手持設備,不太理想。在後續小節中,我們將以 Internet 上的一個簡單的 XML 源為例,來看看如何在 Android 應用程序中使用上述各種 API 來解析它。首先,我們來看看這個簡單應用程序的主要部分,它將通過 Internet 來使用 XML。
Android 新聞閱讀器
應用程序將從熱門 Android 開發人員站點 Androidster 獲取一個 RSS 提要,並將它解析為一組簡單的 Java 對象,您可以使用這些對象構建一個 Android ListView(參見 下載 部分獲取源代碼)。這是一種典型的多態行為 — 提供相同行為的不同實現(不同的 XML 解析算法)。清單 1 展示了如何在 Java 代碼中使用一個接口建立這一模型。
清單 1. XML 提要解析器接口[size=0.76em]
package org.developerworks.android;
import java.util.List;
public interface FeedParser {
List
}
復制代碼
在 清單 2 中,Message 類是一個典型的 Plain Old Java Object (POJO),它表示一種數據結構。
清單 2. Message POJO
public class Message implements Comparable
static SimpleDateFormat FORMATTER =
new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z");
private String title;
private URL link;
private String description;
private Date date;
// getters and setters omitted for brevity
public void setLink(String link) {
try {
this.link = new URL(link);
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
}
public String getDate() {
return FORMATTER.format(this.date);
}
public void setDate(String date) {
// pad the date if necessary
while (!date.endsWith("00")){
date += "0";
}
try {
this.date = FORMATTER.parse(date.trim());
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
@Override
public String toString() {
// omitted for brevity
}
@Override
public int hashCode() {
// omitted for brevity
}
@Override
public boolean equals(Object obj) {
// omitted for brevity
}
// sort by date
public int compareTo(Message another) {
if (another == null) return 1;
// sort descending, most recent first
return another.date.compareTo(date);
}
}
復制代碼
清單 2 中的消息基本上是相當直觀的。通過允許日期和鏈接作為簡單的對象被訪問,同時將它們表示為較強類型的對象(java.util.Date 和java.net.URL),它隱藏了一些內部狀態。它是一個典型的 Value Object,因此它基於其內部狀態實現了equals() 和 hashCode()。它還實現了Comparable 接口,因此您可以使用它進行排序(按日期)。在實踐中,提要中的數據始終是有序的,因為沒有必要再進行排序。
每個解析器實現都需要提供一個 URL 給 Androidster 提要,並使用它打開一個到 Androidster 站點的 HTTP 連接。這一常見行為自然是在 Java 代碼中建模,我們使用了一個抽象基類,如 清單 3 所示。
清單 3. 基本提要解析器類
public abstract class BaseFeedParser implements FeedParser {
// names of the XML tags
static final String PUB_DATE = "pubDate";
static final String DESCRIPTION = "description";
static final String LINK = "link";
static final String TITLE = "title";
static final String ITEM = "item";
final URL feedUrl;
protected BaseFeedParser(String feedUrl){
try {
this.feedUrl = new URL(feedUrl);
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
}
protected InputStream getInputStream() {
try {
return feedUrl.openConnection().getInputStream();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
復制代碼
基類存儲 feedUrl 並使用它打開了一個 java.io.InputStream。如果出現任何差錯,它會拋出一個 RuntimeException,造成應用程序出現故障。基類還為標記的名稱定義了一些簡單的常量。清單 4 顯示了提要中的一些示例內容,以便於您理解這些標記的重要性。
清單 4. 示例 XML 提要
[url]http://www.androidster.com/android_news.php[/url]
[url]http://www.androidster.com/android_news/samsung-s8000-to-run-android-[/url]
play-divx-take-over-the-world
to run Android. A yet-to-be announced phone called the S8000 is being
reported ...