Android天气预报之基于HttpGet对象解析天气数据的方法
投稿:shichen2014
这篇文章主要介绍了Android天气预报之基于HttpGet对象解析天气数据的方法,非常实用的功能,需要的朋友可以参考下
本文实例所述为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天气预报程序的开发能够起到一定的帮助作用。