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

(0)

相关推荐

  • 详解http访问解析流程原理

    详解http访问解析流程原理 http访问网址域名解析流程: 1.在浏览器中输入www.qq.com域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析. 2.如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析. 3.如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/ip参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器

  • Android M(6.x)使用OkHttp包解析和发送JSON请求的教程

    关于Android 6.0 Android老版本网络请求: 1,HttpUrlConnection 2,Apache Http Client Android6.0版本网络请求: 1,HttpUrlConnection 2,OkHttp Android6.0版本废弃了老的网络请求,那么它的优势是什么呢? 1,支持SPDY,共享同一个Socket来处理同一个服务器的所有请求 2,如果SPDY不可用,则通过连接池来减少请求延时 3,无缝的支持GZIP来减少数据流量 4,缓存响应数据来减少重复的网络请求

  • 激动人心的 Angular HttpClient的源码解析

    Angular 4.3.0-rc.0版本已经发布

  • C#如何解析http报文

    下面通过一段内容有文字说明有代码分析,并附有展示图供大家学习. 要解析HTTP报文,需要实现以下操作: 读取HTTP报头提供的各种属性 分析属性值,从中获取内容编码和字符集编码 将报头数据和内容进行分离 判断内容是否文本还是二进制,如果是二进制的则不进行处理 如果内容是文本,按报头中提供的内容编码和字符集编码进行解压缩和解码 目前没有找到.Net框架内置的解析方法,理论上HttpClient等类在内部应该已经实现了解析,但不知为何没有公开这些处理方法.(亦或是我没找到) 那么只能自己来解析这些数

  • 各类Http请求状态(status)及其含义详细解析

    Web服务器响应浏览器或其他客户程序的请求时,其应答一般由以下几个部分组成:一个状态行,几个应答 头,一个空行,内容文档.下面是一个最简单的应答   : 状态行包含HTTP版本.状态代码.与状态代码对应的简短说明信息.在大多数情况下,除了Content-Type之 外的所有应答头都是可选的.但Content-Type是必需的,它描述的是后面文档的MIME类型.虽然大多数应答 都包含一个文档,但也有一些不包含,例如对HEAD请求的应答永远不会附带文档.有许多状态代码实际上用 来标识一次失败的请求,

  • HTTPS混合内容解析附解决方法

    什么是HTTPS混合内容 我们可能会有这样的经验,当我们通过HTTPS访问一个网站的时候,突然有提示:"本页面包含有不安全的内容".这个时候会询问是否显示"不安全的内容",这个时候,就是遇到了有混合内容的页面了. HTTPS下的页面,几乎很少是采用单一连接,HTML标识.图片.JS脚本以及其他页面资源不仅是多个连接获取到,甚至可能是来自完全不同的服务器和网站.为了确保一个页面进行了正确的加密,所有的页面资源都通过HTTPS进去获取是必要的.但在实际情况中,全部资源都

  • 深入解析nodejs HTTP服务

    我最近在研究nodejs的路上,正好这两天了解了nodejs HTTP服务,那么今天也算个学习笔记吧! nodejs最重要的方面之一是具有非常迅速的实现HTTP和HTTPS服务器和服务的能力.http服务是相当低层次的,你可能要用到不同的模块,如express来实现完整的Web服务器,http模块不提供处理路由.cookie.缓存等的调用.我们主要用http模块的地方是实现供应用程序使用的后端Web服务.  1.处理URL 统一资源定位符(URL)为把一个请求发到正确的服务器的特定端口上,并访问

  • 解析ajax核心XMLHTTPRequest对象的创建与浏览器的兼容问题

    MLHttpRequest 对象是AJAX功能的核心,要开发AJAX程序必须从了解XMLHttpRequest 对象开始. 了解XMLHttpRequest 对象就先从创建XMLHttpRequest 对象开始,在不同的浏览器中创建XMLHttpRequest 对象使用不同的方法: 先看看IE创建XMLHttpRequest 对象的方法(方法1): var xmlhttp=ActiveXobject("Msxml12.XMLHTTP");//较新的IE版本创建Msxml12.XMLHT

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

    本文实例所述为Android天气预报之解析天气数据的代码,可实现获取HttpGet对象读取天气网站天气数据,并从数据中解析出天气数据,比如温度.温度.风力.风向.未来几天天气趋势.当天天气状况.空气污染指数等信息,还包括了调用对应的图片或天气动画文件,对于开发android天气预报程序的可以参考本文实例. 具体功能代码如下: import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayL

  • Android编程实现基于BitMap获得图片像素数据的方法

    本文实例讲述了Android编程实现基于BitMap获得图片像素数据的方法.分享给大家供大家参考,具体如下: 网上看到的参考是: int[] pixels = new int[bit.getWidth()*bit.getHeight()];//保存所有的像素的数组,图片宽×高 bit.getPixels(pixels,0,bit.getWidth(),0,0,bit.getWidth(),bit.getHeight()); for(int i = 0; i < pixels.length; i+

  • Android解析JSON数据的方法分析

    本文实例讲述了Android解析JSON数据的方法.分享给大家供大家参考,具体如下: JSON作为一种"轻量"的数据结构传递数据,在JS中有广泛的应用 Google公司对JSON的解析提供了gson.jar这个包,它不依赖于其他任何JAR包:自从Android3.0中已经合入了该解析器的功能,但之前的版本是没有的. findViewById(R.id.parseBtn).setOnClickListener(new OnClickListener(){ @Override public

  • Android编程使用sax解析xml数据的方法详解

    本文实例讲述了Android编程使用sax解析xml数据的方法.分享给大家供大家参考,具体如下: 随着技术的发展,现在的web已经和以前不同了.web已经逐渐像移动的方向倾斜,作为程序员的确应该拓展一下自己的知识层面.学习各方面的知识,今天就接着前几天的弄一下Android的xml解析,这次就使用sax的方式解析xml.下面就一步一步的来做吧. 1. 编写一个简单的xml <?xml version="1.0" encoding="UTF-8"?> &l

  • 实例详解esp8266解析json数据的方法

    #include <ArduinoJson.h> void setup() { Serial.begin(115200); Serial.println("这里用于测试json数据的解析"); // DynamicJsonDocument对象 定义时候我们需要定义一个大小信息+复制大小 const size_t capacity = JSON_OBJECT_SIZE(2) + 30; DynamicJsonDocument doc(capacity); // 要解析的jso

  • springboot实现FastJson解析json数据的方法

    最近在研究springboot实现FastJson解析json数据的方法,那么今天也算个学习笔记吧! 添加jar包: <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.15</version> </dependency> 两种方式启动加载类: 第一种继承WebMvcConfigur

  • SQL Server解析XML数据的方法详解

    本文实例讲述了SQL Server解析XML数据的方法.分享给大家供大家参考,具体如下: --5.读取XML --下面为多种方法从XML中读取EMAIL DECLARE @x XML SELECT @x = ' <People> <dongsheng> <Info Name="Email">dongsheng@xxyy.com</Info> <Info Name="Phone">678945546</

  • newtonsoft.json解析天气数据出错解决方法

    今天用NewtonSoft.JSon解析一个天气数据,数据格式如: 复制代码 代码如下: {"status":1,"detail":"\u6570\u636e\u83b7\u53d6\u6210\u529f","data":[[{"date":"2014-01-01","dis_id":"1119","dis_name":&qu

  • 利用Golang解析json数据的方法示例

    本文主要给大家介绍的是关于Golang解析json数据的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 使用 Golang 解析 json 数据,这种 json 格式是对象的数组,官方文档有一个示例: var jsonBlob = []byte(`[ {"Name": "Platypus", "Order": "Monotremata"}, {"Name": "Quoll

  • Android 使用手机NFC的读取NFC标签数据的方法

    一 你需要准备的: 一部有nfc的手机,一张有nfc标签的卡 二 nfc简介 nfc(近距离无线通讯技术),是由非接触式射频识别(RFID)及互连互通技术整合演变而来,通过在单一芯片上集成感应式读卡器.感应式卡片和点对点通信的功能,利用移动终端实现移动支付.电子票务.门禁.移动身份识别.防伪等应用. 三 nfc过滤标签的设置 3-1 在Manifest添加权限: 在xml里添加nfc的使用权限 <uses-permission android:name="android.permissio

随机推荐