Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android天氣預報之基於HttpGet對象解析天氣數據的方法

Android天氣預報之基於HttpGet對象解析天氣數據的方法

編輯: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天氣預報程序的開發能夠起到一定的幫助作用。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved