天气项目·Bean
一、FutureWeatherBean
输出未来各天的天气情况吗,内含变量:temperture、 wind、 weather、week。
(一)初始化(Ctrl+1)
(二)get( )/set( )函数。(右键->source->Generate Getters and Setters)
二、WeatherBean
读取JSON数据。通过JSONObject来创建WeatherBean对象
JSON数据格式:键值对相对应的,Bean里含有私有数据:cityName、cityId、week、dateY、weather、pm、pmLevel、wind、temperture、windLevel、ArrayListfutureWeatherList;
private ArrayList<FutureWeatherBean> futureWeatherList;//一个Bean的动态数组
(一)构造函数(Ctrl+1)
初:构造函数中,从JSON数据读出相应的数据。在mainActivity中有JsonObject对象:weatherJsonObject,用for循环从对象中读取出数据(weatherJsonObject.getString),并放入String对象。最后将读取出来的数据放入一个Bean对象。
此外,所有的try-catch中的异常都放大,如:IOException->Exception.
futureWeatherList = new ArrayList<FutureWeatherBea>();//初始化数组
try { //会抛出异常,Ctrl+1,添加try-catch
cityName =weatherJsonObject.getString("city");
cityId = weatherJsonObject.getInt("cityid")...//通过JsonObject的key获取值,并赋给字符串
for (int i = 1; i < 7; i++) {
String futureWeather = weatherJsonObject.getString("weather"+ i);//json里的变量名是weather1
String futureWeek = getFutureWeekStringBy(week, i)...//依次获取futureTemperture, futureWind
FutureWeatherBean futureWeatherBean = new FutureWeatherBean(futureTemperture, futureWind, futureWeather, futureWeek);// 封装成一个FutureWeatherBean。注意有数组属性时一定要初始化数组才能使用
futureWeatherList.add(futureWeatherBean);}//添加到List里
} catch (Exception e) {
e.printStackTrace();}}
后:将部分程序进行封装,相应地改为:以String resultString作为返回值的构造方法。并新写private String dealWithResultString(String resultString) 方法。在try的开头添加:
String resultJsonString = dealWithResultString(resultString);//新添方法
JSONObject jsonObject = new JSONObject(resultJsonString);// 通过JSON字符串创建JSONObject的对象
JSONObject weatherJsonObject = jsonObject.getJSONObject("weatherinfo");//取出JSON数据里的"weatherinfo"并赋给weatherJsonObject
总而言之:构造方法是将JSON数据里有用的信息提取出来封装成一个FutureWeatherBean
实现方法:将JSON数据里的"weatherinfo"并赋给weatherJsonObject,再将weatherJsonObject里的数据依次取出赋值给String字符串,再将各字符串封装成一个FutureWeatherBean
(二)get( )/set( )函数。(右键->source->Generate Getters and Setters)
(三)private String dealWithResultString(String resultString)
int startIndex = resultString.indexOf("(") + 1;// 找到左右括号在字符串中的位置。
int endIndex = resultString.indexOf(")");
return resultString.substring(startIndex, endIndex);// 根据左右括号的位置截取中间的JSON字符串。
(四)private String getFutureWeekStringBy(String week2, int itemIndex)
一个关于获取明天是"星期X"的小算法
ArrayList <String> weekStringList = new ArrayList();//new 一个动态数组,用于存放“星期X”
weekStringList.add("星期一")...//把“星期X”添加到StringList里
int currentDayIndex = weekStringList.indexOf(week);//今天的下标:值为“星期一”,对应下标为:0。(JSON里有键值对:"week": "星期一")
int futureDayIndex = currentDayIndex + itemIndex;//计算明天的下标
if (futureDayIndex > 6) futureDayIndex -= 7;// 一共七天,循环
return weekStringList.get(futureDayIndex);//根据计算的下标返回String