根據天氣預報系統功能需求分析,系統啟動后,應在主界面上呈現出中國國內所有城市的列表數據,因此需要創建中國城市列表數據,包括獲取、解析城市列表數據,并在用戶界面上呈現出來。為此,需要解決的問題是手機終端從Web 服務器獲取了所有類型的數據之后,將這些數據進一步交給Android 手機終端View 組件[4],在手機界面上顯示給用戶。
?、?獲取城市列表數據
Android 沒有提供Web Service 的組件庫,但可以通過修改在PC 或J2ME 上使用的開源Web Service Java 庫作為AndroidWeb Servic 庫使用。kSOAP2(http://ksoap2.sourceforge.net)是一個在智能手機上的SOAP Web Service 客戶端包,可用于資源受限制的Java 環境如Applets 或J2ME 應用程序。在GoogleCode 上有一個項目ksoap2-android(http://code.google.com/p/ksoap2-android/)可用在Android 平臺上實現輕量級的SOAP 庫,即使用ksoap2-android 的API 來調用遠端Web Service 的服務。
因此需要在CitiesWeatherForecast.java 的onCreate()中進行數據獲取的初始化工作。通過定義一個方法public ListgetAllCitiesNAMEs()可獲得中國城市名稱列表。也就是說,采用它提供的獲得全球各個國家城市的方法GetCitiesByCountry,通過http://www.webservicex.net/globalweather.asmx 上的WebService 可提供天氣預報服務。譬如,通過Constant.java 中的public class Constant{},設置SOAP Action 要調用的方法名、命名空間以及Web Service URL值,其源代碼為:
public static final String SOAP_ACTION=
"http://www.webserviceX.NET/GetCitiesByCountry";
public static final String METHOD_NAME=
"GetCitiesByCountry";
public static final String SOAP_ACTION2=
"http://www.webserviceX.NET/GetWeather";
public static final String METHOD_NAME2="GetWeather";
public static final String NAMESPACE=
"http://www.webserviceX.NET";
public static final String URL=
http://www.webservicex.net/globalweather.asmx;
然后在WebServiceCaller.java 中實例化一個SoapSerializationEnvelope對象,設置SoapObject 的命名空間、方法名、參數等;并通過實例化一個AndroidHttpTransport 對象來調用WebService,并獲得xml 字符串數據,其代碼段如下:
AndroidHttpTransport androidHttpTransport=
new AndroidHttpTransport (Constant.URL);
try {
androidHttpTransport.call(soapAction, envelope);
Object result=envelope.getResponse();
xmlStr=result.toString();
} catch(Exception e) {
e.printStackTrace();
}
⑵ 解析數據列表
Android 操作系統對xml 字符串數據的操作功能很強,提供了dom、sax 以及xmlpul 3 種方式。Android SDK 提供了android.sax 包以方便SAX Handler 的開發,可用來解析xml 結果字符串。在本設計實例的CitiesWeatherForecast.java 文件中,解析xml 數據時,先通過RootElement root=new RootElement("NewDataSet")獲得xml 數據的根節點;然后再尋找其子節點直到找到City 子節點,并設置一個監聽器setEndTextElementListener()來獲得City 子節點的值;最后使用org.xml.sax 的SAXParser 來解析xml 數據,把數據存入List并返回:
SAXParserFactory factory=SAXParserFactory.newInstance();
SAXParser parser=factory.newSAXParser();
XMLReader xmlreader=parser.getXMLReader();
xmlreader.setContentHandler(root.getContentHandler());
InputSource is=new InputSource
(new StringBufferInputStream(xmlStr));
xmlreader.parse(is);
?、?在UI上呈現城市列表數據
當獲得List類型的數據之后,就可以把它綁定到main.xml 定義的ListView 組件上,然后使用ListActivity 呈現列表數據。在CitiesWeatherForecast.java 中的代碼段為:
List cityList=getAllCitiesNames();
setListAdapter(new ArrayAdapter(this,
android.R.layout.simple_list_item_1, cityList));
即使用方法setListAdapter()把一個ListActivity 填充進去。
2.3 城市天氣實況預報系統的調試
城市天氣實況預報系統的測試結果如下。在Eclipse 的Package Explorer 窗口中用鼠標右鍵選擇CitiesWeatherForecast工程名,在彈出的窗口中選擇"Run As"→"Android Application"安裝該應用程序到Android 模擬器并啟動它。然后單擊所要查詢的城市名稱列表項,稍等片刻便會顯示出該城市的天氣實況信息。也可以在文本框中直接輸入所要查詢的城市名稱,單擊"Search"同樣會獲得相應城市的天氣預報信息。
3 結束語
本文在介紹基于Android 平臺的應用程序設計原理的基礎上,提出了Android 用戶界面設計、獲取并解析城市列表數據的一種方法,給出了在用戶界面上呈現數據的原理與設計過程,最后通過模擬器進行了應用程序的調試。當然,基于Android 平臺的開發技術還需要進一步完善,需要在日后的工作中不斷探索、研究,以建立實用的城市天氣實況預報系統。
評論
查看更多