編輯:關於Android編程
本文實例所述為Android天氣預報之解析天氣數據的代碼,可實現獲取HttpGet對象讀取天氣網站天氣數據,並從數據中解析出天氣數據,比如溫度、溫度、風力、風向、未來幾天天氣趨勢、當天天氣狀況、空氣污染指數等信息,還包括了調用對應的圖片或天氣動畫文件,對於開發android天氣預報程序的可以參考本文實例。
具體功能代碼如下:
import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import java.util.Locale; import net.tsz.afinal.FinalHttp; import net.tsz.afinal.http.AjaxCallBack; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import org.json.JSONException; import org.json.JSONObject; import org.lmw.weather.MyApp; import org.lmw.weather.entity.WeatherEntity; import android.app.Activity; import android.os.Handler; import android.os.Message; /** * 解析天氣數據 * @author Dave */ public class WeatherData { private Activity activity; private FinalHttp fh; public static String def_weather_key="def_weather"; public WeatherData(Activity activity) { this.activity = activity; fh = new FinalHttp(); fh.configTimeout(1000 * 3); } public void getData(final String cityId,final Handler hd) { StringBuffer sb_url = new StringBuffer(); sb_url.append("http://0.qnweather.duapp.com/weather.php?uri="); sb_url.append("http://m.weather.com.cn/data/"); sb_url.append(cityId); sb_url.append(".html"); final Message msg=new Message(); fh.get(sb_url.toString(), new AjaxCallBack() { @Override public void onSuccess(Object t) { super.onSuccess(t); MySharedPreferences.writeMessage(activity, "def_weather",t.toString()); msg.what=0; msg.obj=parseJson(t.toString()); hd.sendMessage(msg); } @Override public void onFailure(Throwable t, int errorNo, String strMsg) { super.onFailure(t, errorNo, strMsg); System.out.println("-------errorNo---------"+errorNo); msg.what=-1; msg.arg1=errorNo; msg.obj=MySharedPreferences.readMessage(activity, def_weather_key, ""); hd.sendMessage(msg); } }); } private String connServerForResult(String strUrl) { // 獲取HttpGet對象 HttpGet httpRequest = new HttpGet(strUrl); String strResult = ""; try { // HttpClient對象 HttpClient httpClient = new DefaultHttpClient(); // 獲得HttpResponse對象 HttpResponse httpResponse = httpClient.execute(httpRequest); if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { // 取得返回的數據 strResult = EntityUtils.toString(httpResponse.getEntity()); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } System.out.println("rresult" + strResult); return strResult; // 返回結果 } // 數據解析 private WeatherEntity parseJson(String strResult) { WeatherEntity weather = null; try { JSONObject jsonObj = new JSONObject(strResult.replace("℃", "°")) .getJSONObject("weatherinfo"); weather = new WeatherEntity(); int ftime = jsonObj.getInt("fchh"); // 更新時間(整點)【更新時間確定temp屬於哪天】 int temp = 0; // 偏移 if (ftime >= 18 || ftime < 8) { weather.setNight(true); temp = 1; } MyApp.week = jsonObj.getString("week");// 今天星期幾 weather.setCity(jsonObj.getString("city")); // 城市 weather.setComfortable(jsonObj.getString("index")); // 舒適度 weather.setRefreshDate(getDate()); // 更新日期 weather.setRefreshTime(getTime()); // 更新時間 weather.setRefreshWeek(getWeek()); // 更新星期 weather.setPicIndex(jsonObj.getInt("img1")); // 當天天氣圖片編號 List<Integer> topPic = new ArrayList<Integer>(); // 最高溫時的圖片編號 if (temp == 1) { topPic.add(getSavePic(activity)); } else { topPic.add(getJsonPic(jsonObj, "img", 1 + temp)); savePic(activity, topPic.get(0)); } topPic.add(getJsonPic(jsonObj, "img", 3 - temp)); topPic.add(getJsonPic(jsonObj, "img", 5 - temp)); topPic.add(getJsonPic(jsonObj, "img", 7 - temp)); weather.setTopPic(topPic); List<Integer> lowPic = new ArrayList<Integer>(); // 最低溫時的圖片編號 lowPic.add(getJsonPic(jsonObj, "img", 2 - temp)); lowPic.add(getJsonPic(jsonObj, "img", 4 - temp)); lowPic.add(getJsonPic(jsonObj, "img", 6 - temp)); lowPic.add(getJsonPic(jsonObj, "img", 8 - temp)); weather.setLowPic(lowPic); // ---------------------------以上為獲取圖片編號,暫且不管---------------------------------------------------------------------- List<String> tempList = new ArrayList<String>(); // 未來五天溫度(第一個是今天) tempList.add(jsonObj.getString("temp1")); tempList.add(jsonObj.getString("temp2")); tempList.add(jsonObj.getString("temp3")); tempList.add(jsonObj.getString("temp4")); tempList.add(jsonObj.getString("temp5")); tempList.add(jsonObj.getString("temp6")); MyApp.tempList.clear(); MyApp.tempList = tempList; List<String> weatherList = new ArrayList<String>();// 未來五天天氣(第一個是今天) weatherList.add(jsonObj.getString("weather1")); weatherList.add(jsonObj.getString("weather2")); weatherList.add(jsonObj.getString("weather3")); weatherList.add(jsonObj.getString("weather4")); weatherList.add(jsonObj.getString("weather5")); weatherList.add(jsonObj.getString("weather6")); MyApp.weatherList.clear(); MyApp.weatherList = weatherList; List<String> tempListMax = new ArrayList<String>(); // 未來五天最高溫度集合(有°符號) if (temp == 1) { tempListMax.add(getSaveTemperature(activity)); } else { tempListMax .add(getTemperatureMaxAndMin(tempList.get(0))[0 + temp]); saveTemperature(activity, tempListMax.get(0)); } tempListMax .add(getTemperatureMaxAndMin(tempList.get(1 - temp))[0 + temp]); tempListMax .add(getTemperatureMaxAndMin(tempList.get(2 - temp))[0 + temp]); tempListMax .add(getTemperatureMaxAndMin(tempList.get(3 - temp))[0 + temp]); weather.setTemperatureMax(tempListMax); weather.setTodayTemperature(getTemperatureMaxAndMin(tempList.get(0))[0]); // 當天溫度(實時) weather.setTodayWeather(jsonObj.getString("img_title1")); // 當天天氣描述(實時) List<String> tempListMin = new ArrayList<String>(); // 未來四天最低溫度集合(有°符號) tempListMin.add(getTemperatureMaxAndMin(tempList.get(0))[1 - temp]); tempListMin.add(getTemperatureMaxAndMin(tempList.get(1))[1 - temp]); tempListMin.add(getTemperatureMaxAndMin(tempList.get(2))[1 - temp]); tempListMin.add(getTemperatureMaxAndMin(tempList.get(3))[1 - temp]); weather.setTemperatureMin(tempListMin); weather.setTomorrowTemperature(tempList.get(1)); // 明天溫度(包括最高溫和最低溫) if (temp == 1) { weatherList.add(getSaveWeather(activity)); } else { weatherList.add(jsonObj.getString("weather" + 1)); saveWeather(activity, weatherList.get(0)); } weatherList.add(jsonObj.getString("weather" + (2 - temp))); weatherList.add(jsonObj.getString("weather" + (3 - temp))); weatherList.add(jsonObj.getString("weather" + (4 - temp))); weather.setWeather(weatherList); weather.setTomorrowWeather(weatherList.get(1)); List<String> windList = new ArrayList<String>(); // 未來四天風力 windList.add(jsonObj.getString("wind1")); windList.add(jsonObj.getString("wind2")); windList.add(jsonObj.getString("wind3")); windList.add(jsonObj.getString("wind4")); weather.setWind(windList); weather.setMaxlist(transplate(tempListMax)); // 未來四天最高溫度集合(無°符號) weather.setMinlist(transplate(tempListMin)); // 未來四天最低溫度集合(無°符號) } catch (JSONException e) { e.printStackTrace(); } return weather; } // 獲取更新日期 並轉換為(X月X日 周X) private String getDate() { SimpleDateFormat sdf = new SimpleDateFormat("MM月dd日 EEE", Locale.CHINA); String date = sdf.format(new java.util.Date()); System.out.println(date); return date; } // 獲取更新時間 並轉換為 (小時:分鐘 更新) private String getTime() { SimpleDateFormat sdf = new SimpleDateFormat("HH:mm", Locale.CHINA); String time = sdf.format(new java.util.Date()) + " " + "更新"; System.out.println(time); return time; } private String getWeek() { return null; } // 獲取最高溫度和最低溫度,有°符號 private String[] getTemperatureMaxAndMin(String str) { return str.split("~"); } // 去除最高溫度和最低溫度裡的°符號 private List<Integer> transplate(List<String> strList) { List<Integer> intList = new ArrayList<Integer>(); for (String temp : strList) { intList.add(Integer.valueOf(temp.split("°")[0])); } return intList; } // 獲取圖片編號 例如"img" + "1" private int getJsonPic(JSONObject jsonObj, String str, int index) throws JSONException { int result = jsonObj.getInt(str + index); if (result == 99 && index > 1) { index--; result = jsonObj.getInt(str + index); } return result; } private void saveTemperature(Activity activity, String value) { // MySharedPreferences mp = new MySharedPreferences(activity); // mp.writeMessage("temperature", value); } // 保存的溫度 private String getSaveTemperature(Activity activity) { return MySharedPreferences.readMessage(activity,"temperature", "100"); } private void saveWeather(Activity activity, String value) { // MySharedPreferences mp = new MySharedPreferences(activity); // mp.writeMessage("weather", value); } // 保存的天氣 private String getSaveWeather(Activity activity) { return MySharedPreferences.readMessage(activity,"weather", ""); } private void savePic(Activity activity, int value) { // MySharedPreferences mp = new MySharedPreferences(activity); // mp.writeMessage("pic", value); } // 保存的天氣圖片編號 private int getSavePic(Activity activity) { return MySharedPreferences.readMessage(activity,"pic", 99); } }
希望本文實例對大家Android天氣預報程序的開發能夠起到一定的幫助作用。
背景:之前有過兩篇寫activity的博客 android之activity的生命周期詳解:詳細介紹了activity的整個生命周期、各狀態間的轉換和返回桌
Handler是開發人員在面試過程中最常見的問題之一了,這篇文章將較為全面地對Handler進行解讀,包括源碼層,以及使用方法。如果看完文章有疑問,歡迎在評論中一起探討基
一、問題:在Android啟動後會在新進程裡創建一個主線程,也叫UI線程(非線程安全)這個線程主要負責監聽屏幕點擊事件與界面繪制。當Application需要進行耗時操作
本節引言: 上一節,我們學習了Xfermode兩個已經過世(過時)的兒子:AvoidXfermode, PixelXorXfermode, 雖然說有點用,但是