国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

Android平臺下的空氣質(zhì)量和天氣情況查詢應(yīng)用設(shè)計與實現(xiàn)

2016-06-16 19:59:19龔世文朱忠敏
電腦知識與技術(shù) 2016年10期
關(guān)鍵詞:Android平臺大氣環(huán)境系統(tǒng)設(shè)計

龔世文+朱忠敏

摘要:Android體系結(jié)構(gòu)采用軟件堆層(Software Stack)的架構(gòu),提供一系列的核心應(yīng)用程序包括瀏覽器、電子郵件客戶端、通訊錄和日歷等,其市場份額長年保持在50%以上,無論從技術(shù)層面還是受眾范圍來看都是非常合適的應(yīng)用開發(fā)平臺。

關(guān)鍵詞:Android平臺;系統(tǒng)設(shè)計;大氣環(huán)境

中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2016)10-0073-04

1 概述

中國經(jīng)濟在過去40年快速的發(fā)展極大地提高了人民生活水平,同時也引起了嚴重的環(huán)境問題。早在2007年Cyranoski便在《自然》雜志撰文指出大氣污染已經(jīng)成為困擾大多數(shù)中國城市的嚴重問題。2009年以來,在國內(nèi)外輿論的引導(dǎo)下大氣污染問題逐步從一個學(xué)術(shù)性議題演變?yōu)檎涡缘拇蟊娮h題。2014年起,環(huán)境保護部開始通過其官方網(wǎng)站正式對公眾發(fā)布實時PM2.5數(shù)據(jù)。數(shù)據(jù)的公開發(fā)布有助消除公眾的疑慮,同時對公共健康起到了指導(dǎo)作用。隨著“互聯(lián)網(wǎng)+”時代的到來,大眾獲取信息的主要手段已經(jīng)從電視廣播報紙轉(zhuǎn)變?yōu)榫W(wǎng)絡(luò),而智能手機的普及化進一步提升了大眾獲取信息的能力。相比于網(wǎng)頁模式,手機端應(yīng)用的最大優(yōu)勢在于可以智能定位,隨時隨地獲取最新數(shù)據(jù)。Android體系結(jié)構(gòu)采用軟件堆層(Software Stack)的架構(gòu),提供一系列的核心應(yīng)用程序包括瀏覽器、電子郵件客戶端、通訊錄和日歷等,其市場份額長年保持在50%以上,無論從技術(shù)層面還是受眾范圍來看都是非常合適的應(yīng)用開發(fā)平臺。因此,在Android系統(tǒng)下,開發(fā)一款能夠?qū)崟r查詢所處位置空氣質(zhì)量和天氣情況的手機應(yīng)用是一個具有明顯用戶需求的任務(wù)。

2 系統(tǒng)設(shè)計

一般的空氣質(zhì)量查詢應(yīng)用只能對大氣顆粒物(PM2.5和PM10)和大氣污染物(SO2、CO、NOX和O3)進行查詢??紤]到氣象因素與大氣污染存在一定關(guān)聯(lián),而且這兩個因素共同決定了用戶進行室外運動的意愿。因此,本文所提應(yīng)用程序劃分為空氣質(zhì)量查詢和天氣查詢兩大功能??諝赓|(zhì)量查詢功能部分劃分為用戶界面、網(wǎng)上數(shù)據(jù)獲取與解析、數(shù)據(jù)適配器和相關(guān)知識查詢四個模塊;天氣查詢功能部分用戶界面、數(shù)據(jù)獲取與解析、數(shù)據(jù)庫適配器三個模塊。各個模塊之間的關(guān)系如下圖1所示。

圖 1 應(yīng)用總體設(shè)計思想

在空氣質(zhì)量查詢功能模塊中,當用戶通過界面發(fā)送請求時,空氣質(zhì)量數(shù)據(jù)獲取子模塊負責(zé)從中國環(huán)境監(jiān)測總站城市空氣質(zhì)量實時發(fā)布平臺加載數(shù)據(jù)信息,然后進行數(shù)據(jù)解析顯示在用戶界面上。氣象數(shù)據(jù)查詢模塊的流程與前者相似,唯一不同在于使用了不同的解析技術(shù)。JSON相對于XML,速率快,數(shù)據(jù)的體積小,JSON與JavaScript的交互更加方便,但JSON對數(shù)據(jù)的描述性比XML較差。因而結(jié)合兩者解析的優(yōu)缺點以及服務(wù)端返回數(shù)據(jù)格式,在解析空氣質(zhì)量數(shù)據(jù)時使用JSON解析,在解析天氣數(shù)據(jù)時使用XML的Pull解析。

3功能實現(xiàn)

3.1程序設(shè)計

通過JSON方式實現(xiàn)PM2.5數(shù)據(jù)解析,通過定義JSONArray和JSONObject獲取大氣環(huán)境的相關(guān)數(shù)據(jù),包括AQI、城市名、PM2.5、PM10、首要污染物、污染級別等,主要代碼如下所示:

protected void onPostExecute(String result) {

ArrayList pm25List = null;

if (result != null && !result.contains("error")) {

Log.d(PM25Provider.LogTag, result);

try { JSONArray localJSONArray = new JSONArray(result);

pm25List = new ArrayList();

for (int i = 0; i < localJSONArray.length(); i++) {

JSONObject localJSONObject = localJSONArray.getJSONObject(i);

PM25Provider.PM25 pm25 = new PM25Provider.PM25();

pm25.aqi = localJSONObject.optString("aqi");

pm25.area = localJSONObject.optString("area");

pm25.pm2_5 = localJSONObject.optString("pm2_5");

pm25.pm10 = localJSONObject.optString("pm10");

pm25.position_name = localJSONObject.optString("position_name");

pm25.primary_pollutant = localJSONObject.optString("primary_pollutant");

pm25.quality = localJSONObject.optString("quality");

pm25.time_point = localJSONObject.optString("time_point");

pm25List.add(pm25); }

} catch (JSONException e) { e.printStackTrace();

} pm25Listener.onInfo(pm25List); } }

在此基礎(chǔ)上,利用API.java訪問網(wǎng)絡(luò)接口并設(shè)置城市名字符串;利用PM25Adapter.java將數(shù)據(jù)加載于界面布局;PM25Citysetting.java實現(xiàn)城市選擇功能;PM25Activity.java完成主界面顯示響應(yīng)功能,首先設(shè)置分享部分響應(yīng),其次設(shè)置初次顯示界面數(shù)據(jù),之后設(shè)置動態(tài)打印報告數(shù)據(jù)加載顯示以及用戶反饋動態(tài)效果響應(yīng)問題,最后通過調(diào)用其他Activity完成數(shù)據(jù)成功顯示??諝赓|(zhì)量報告顯示主要代碼如下所示:

new PM25Provider().request(new PM25Provider.PM25Info() {

public void onInfo(List pm25List) {

if (pm25List == null) {

Toast.makeText(PM25Activity.this, R.string.get_pm25_fail,

Toast.LENGTH_SHORT).show();

return; }

PM25Provider.PM25 pm25 = (PM25Provider.PM25) pm25List.get(-1

+ pm25List.size());

vAQI = wrapFont(pm25.aqi);

vPM25 = wrapFont(pm25.pm2_5);

mPaperAQI.setText(vAQI);

try {

Date date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")

.parse(pm25.time_point);

SimpleDateFormat sdf = new SimpleDateFormat(

"yyyy年MM月dd日 HH:mm");

vTime = sdf.format(date);

mPaperTime.setText("發(fā)布時間:" + vTime);

vCity = pm25.area;

mPaperArea.setText(vCity);

vQuality = pm25.quality;

mPaperQuality.setText("等級:" + vQuality);

mPaperProposal.setText("建議:" + (String) maps.get(vQuality));

mValue.setText("88888 ");

mListView.setAdapter(new PM25Adapter(PM25Activity.this,

pm25List));

startInfoShow();

} catch (ParseException e) {

e.printStackTrace();

}

}

}, city);

}

氣象功能實現(xiàn)代碼包:com.weaher,其中Config.java配置信息類;DBAdapter.java實現(xiàn)數(shù)據(jù)庫配置;Forecast.java未來天氣類;Weather.java當前天氣類;WeatherAdapter.java數(shù)據(jù)獲取模塊,使用XML Pull解析數(shù)據(jù);WeatherDemo.java該功能的程序啟動默認界面響應(yīng)。

在WeatherAdapter.java數(shù)據(jù)獲取模塊中首先設(shè)置靜態(tài)變量getWeather,通過HttpClient的get或post方式請求服務(wù)器,然后建立XmlPullParser解析器解析服務(wù)器返回的數(shù)據(jù),使用while if語句獲取四天內(nèi)weather的時間、地點、溫度、氣候、風(fēng)力,其在Forecast.java和Weather.java中定義好需要獲取的變量數(shù)據(jù)名。

Pull解析代碼如下面所示:

private static void getWeatherData(String city) throws IOException,Throwable{

String requestUrl = "http://api.map.baidu.com/telematics/v3/weather?location="

+city +"&output=xml&ak=A72e372de05e63c8740b2622d0ed8ab1";

String result = request("POST",requestUrl);

InputStream streamTemp = new ByteArrayInputStream(result.getBytes());

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();

factory.setNamespaceAware(true);

XmlPullParser parser = factory.newPullParser();

parser.setInput(streamTemp,"UTF-8");

while(parser.next()!=XmlPullParser.END_DOCUMENT){

String element = parser.getName();

if(element != null && element.equals("weather_data")){

for(int dayCount = 0;dayCount<4;++dayCount){

if(dayCount == 0){

Weather.city = city;

System.out.println(city); }

while(parser.next()!=XmlPullParser.END_DOCUMENT){

element = parser.getName();

if((element != null)){

if (element.equals("date")) {

if(dayCount == 0)

Weather.current_date_time = parser.nextText();

else

Weather.day[dayCount-1].day_of_week = parser.nextText(); }

else if (element.equals("dayPictureUrl")) {

if(dayCount == 0)

Weather.current_dayPictureUrl = parser.nextText();

else

Weather.day[dayCount-1].dayPictureUrl = parser.nextText(); }

else if (element.equals("nightPictureUrl")) {

if(dayCount == 0)

Weather.current_nightPictureUrl = parser.nextText();

else

Weather.day[dayCount-1].nightPictureUrl = parser.nextText(); }

else if (element.equals("weather")) {

if(dayCount == 0)

Weather.current_weather = parser.nextText(); else

Weather.day[dayCount-1].weather = parser.nextText(); }

else if (element.equals("wind")) {

if(dayCount == 0)

Weather.current_wind = parser.nextText(); else

Weather.day[dayCount-1].wind = parser.nextText(); }

else if (element.equals("temperature")) {

if(dayCount == 0)

Weather.current_temp = parser.nextText(); else

Weather.day[dayCount-1].temperature = parser.nextText(); break;

}

服務(wù)器請求代碼如下所示:

private static String request(String method, String url) {

HttpResponse httpResponse = null;

StringBuffer result = new StringBuffer();

try {

if (method.equals("GET")) {

HttpGet httpGet = new HttpGet(url);

HttpClient httpClient = new DefaultHttpClient();

httpResponse = httpClient.execute(httpGet);

HttpEntity httpEntity = httpResponse.getEntity();

result.append(EntityUtils.toString(httpEntity, "utf-8"));

StatusLine statusLine = httpResponse.getStatusLine();

result.append(":" + statusLine.getProtocolVersion() + "\r\n");

int statusCode = statusLine.getStatusCode();

result.append(":" + statusCode + "\r\n");

} else if (method.equals("POST")) {

HttpPost httpPost = new HttpPost(url);

HttpClient httpClient = new DefaultHttpClient();

httpResponse = httpClient.execute(httpPost);

HttpEntity httpEntity = httpResponse.getEntity();

result.append(EntityUtils.toString(httpEntity, "utf-8"));

}

} catch (Exception e)

3.2 UI展示

空氣質(zhì)量查詢界面設(shè)有城市選擇和查詢兩個按鈕,選擇按鈕可以選擇城市、實現(xiàn)PM2.5與AQI切換,查詢按鈕可以實現(xiàn)動態(tài)效果。在連網(wǎng)的狀態(tài)下,可以自動定位到當前城市,顯示其AQI值,通過選擇按鍵可以切換PM2.5和AQI值,如圖2左1所示即為切換到PM2.5的狀態(tài)。當點擊查詢會打印一份空氣質(zhì)量檢測報告,報告上顯示有標題、發(fā)布時間、當前城市名、AQI值、等級、建議措施、各監(jiān)測點PM2.5、PM10的值以及分享標志,用戶可以分享到QQ、微信、微博等等一系列軟件中,效果如圖2左2至右1所示。

在天氣查詢界面中,主要顯示天氣實時數(shù)據(jù)(包括地區(qū)、時間、溫度、氣候、風(fēng)力)、未來三天天氣數(shù)據(jù)(包括溫度、氣候)、城市選擇和城市保存設(shè)置。其整體布局是LinearLayout線性布局,局部運用表格布局TableLayout和TableRow、TextView顯示未來三天數(shù)據(jù)信息,使用RelativeLayout布局和Button、EditText、TextView控件顯示城市設(shè)置信息。當用戶選擇城市后,點擊保存設(shè)置按鈕,界面會顯示“城市設(shè)置成功”字樣,在網(wǎng)絡(luò)通暢的情況下,即可顯示城市天氣相關(guān)信息。而當無網(wǎng)狀態(tài)下,全部顯示為null。如圖3所示。

4 結(jié)束語

通過虛擬機和移動終端的測試表明,此應(yīng)用可以正常運行。整體界面以藍色系為主,設(shè)計美觀,給人一種清新舒暢的視覺享受,操作簡單,易于掌握。需要指出的是該應(yīng)用的空氣質(zhì)量數(shù)據(jù)和天氣數(shù)據(jù)全部來源于網(wǎng)絡(luò),因此在運行時需確保系統(tǒng)環(huán)境的網(wǎng)絡(luò)流暢性。

參考文獻:

[1] Cyranoski D. Satellite view alerts china to soaring pollution[J]. Nature 2005, 437: 12.

[2] Cyranoski D. Monitoring air pollution[J]. Nature 2007, 448: 518.

[3] 董冠洋. 2014年中國190個城市將實時發(fā)布PM2.5數(shù)據(jù)[N]. 中國新聞社,2013-12-31

[4] 關(guān)立勛.Android 應(yīng)用開發(fā)深入學(xué)習(xí)實錄[M].北京:電子工業(yè)出版社,2013.

[5] 李斌.空氣質(zhì)量實時發(fā)布系統(tǒng)數(shù)據(jù)上傳問題的探討[J].環(huán)境科學(xué)與技術(shù),2011,34(12H):242- 244.

[6] 趙啟明.Android典型技術(shù)模塊開發(fā)詳解[M].北京:中國鐵道出版社,2012.

[7] 隆益民.Android應(yīng)用開發(fā)[M].廣州:中山大學(xué)出版社,2010.

[8] 王灝,馬軍.Java完全自學(xué)手冊[M].北京:機械工業(yè)出版社,2006:20-55.

[9] 王國輝,李偉.Android開發(fā)寶典[M].北京:機械工業(yè)出版社,2008.

猜你喜歡
Android平臺大氣環(huán)境系統(tǒng)設(shè)計
城市交通大氣環(huán)境影響評價及預(yù)測技術(shù)研究
科技資訊(2016年27期)2017-03-01 17:17:55
基于Android平臺軟件開發(fā)技術(shù)研究
科技資訊(2016年25期)2016-12-27 18:46:40
基于Android平臺的人臉識別系統(tǒng)設(shè)計與實現(xiàn)
基于Android平臺的健康醫(yī)療APP設(shè)計與開發(fā)
淺析大氣環(huán)境質(zhì)量有效監(jiān)測探究
東方教育(2016年3期)2016-12-14 20:05:02
一種基于SATA硬盤陣列的數(shù)據(jù)存儲與控制系統(tǒng)設(shè)計研究
Android手機主題設(shè)計 
工業(yè)熱電偶計量檢定系統(tǒng)設(shè)計
基于物聯(lián)網(wǎng)的煤礦智能倉儲與物流運輸管理系統(tǒng)設(shè)計與應(yīng)用
目標特性測量雷達平臺建設(shè)構(gòu)想
科技視界(2016年22期)2016-10-18 14:34:34
阜康市| 水富县| 涡阳县| 新宁县| 绥江县| 无极县| 如皋市| 铁岭市| 宜兰市| 全州县| 金坛市| 余庆县| 铁岭县| 衡山县| 宜兰市| 张北县| 林口县| 芜湖市| 云浮市| 彝良县| 那曲县| 屏东县| 黔西| 虎林市| 嘉荫县| 广灵县| 共和县| 丹凤县| 姚安县| 中山市| 光泽县| 且末县| 淮阳县| 长白| 信丰县| 玉溪市| 宁安市| 泉州市| 凌云县| 安西县| 巨鹿县|