Android天气预报之基于HttpGet对象解析天气数据的方法

作者:shichen2014 时间:2021-11-01 08:00:13 

本文实例所述为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天气预报程序的开发能够起到一定的帮助作用。

标签:Android,HttpGet
0
投稿

猜你喜欢

  • Android开发中WebView的简单使用小结

    2022-09-11 00:22:43
  • Kotlin协程到底是如何切换线程的

    2022-03-03 13:52:39
  • java单机接口限流处理方案详解

    2021-05-25 21:08:07
  • Quartz.Net使用方法详解

    2023-08-17 11:50:54
  • Java 常见的几种内存溢出异常的原因及解决

    2023-02-21 16:44:50
  • C# 添加、修改以及删除Excel迷你图表的实现方法

    2023-04-06 22:07:27
  • Spring Boot 集成Shiro的多realm配置过程

    2023-09-17 10:07:26
  • 解析android中include标签的使用

    2022-08-17 06:59:59
  • Spring之@Aspect中通知的5种方式详解

    2021-12-12 20:28:02
  • Android Apk反编译及加密教程

    2022-01-13 01:01:25
  • springboot配置redis过程详解

    2022-10-13 12:41:30
  • Zookeeper连接超时问题与拒绝连接的解决方案

    2023-11-20 03:41:29
  • java输入数字,输出倒序的实例

    2023-06-20 01:59:44
  • SpringBoot中配置Web静态资源路径的方法

    2023-10-26 03:49:21
  • 一文带你吃透JSP增删改查实战案例详细解读

    2021-08-17 17:10:22
  • 解析Java中PriorityQueue优先级队列结构的源码及用法

    2023-11-08 13:33:11
  • Java synchronized重量级锁实现过程浅析

    2023-10-25 14:10:17
  • mybatis中批量插入的两种方式(高效插入)

    2023-09-16 22:21:07
  • 对Java中传值调用的理解分析

    2023-05-03 15:22:14
  • C#中的不可变数据类型介绍(不可变对象、不可变集合)

    2022-06-13 19:08:33
  • asp之家 软件编程 m.aspxhome.com