极客学院天气项目总结
2016-03-20 09:53
405 查看
极客学院天气项目总结
功能描述:
1:主Activity负责显示天气数据的布局
2:Service后台通过聚合数据API获取到天气数据,将数据放进javaBean中
3:主Activity利用javaBean里面的数据填充到具体的布局中
4:城市切换
5:下拉刷新功能
开发流程:
准备阶段:
一:导入聚合数据的jar
二:在AndroidManifest.xml总配置文件中添加相关权限和聚合数据的id
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.READ_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<meta-data
android:name="com.thinkland.juheapi.openid"
android:value="JHe5425b4eb3e7baeede8c687f22dc1ece" />
三:
在调用接口之前需要初始化聚合数据SDK,只需要初始化一次即可。需要在Application中调用初始化方法.
import android.app.Application;
import com.thinkland.juheapi.common.CommonFun;
public class WeatherApplication extends Application{
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
//JuheSDKInitializer.initialize(getApplicationContext());
CommonFun.initialize(getApplicationContext());
}
}
具体开发:
一:主activity加载主布局文件,在oncreate方法中调用initService方法,启动后台服务获取天气信息
WeatherService具体实现:
·通过new一个线程,利用mHandler.sendEmptyMessage(CALLBACK_OK);发送具体城市,
然后handler接收
switch (msg.what) {
case REPEAT_MSG:
//调用getCity方法获取天气数据
getCityWeather();//更新数据
//发送一个延迟消息,30分钟
sendEmptyMessageDelayed(REPEAT_MSG, 30 * 60 * 1000);
break;
·具体的获取天气方法
WeatherData data=WeatherData.getInstance();
data.getByCitys(city, 2, new JsonCallBack() {
@Override
public void jsonLoaded(JSONObject json) {
// TODO Auto-generated method stub
weatherBean = parseWeather(json);
if(weatherBean!=null){
Log.i("LSD",weatherBean.toString());
}
//关闭
countDownLatch.countDown();
}
});
// 获取未来三小时
data.getForecast3h(city, new JsonCallBack() {
@Override
public void jsonLoaded(JSONObject json) {
// TODO Auto-generated method stub
// System.out.println(arg0);
if (json!=null) {
Log.i("LSD","获取未来三小时的json数据:"+json);
}
list = parserForecast3h(json);
if(list!=null){
Log.i("LSD",list.toString());
}
//关闭
countDownLatch.countDown();
}
});
// 接下来设置PM值
AirData airData = AirData.getInstance();
airData.cityAir(city, new JsonCallBack() {
@Override
public void jsonLoaded(JSONObject arg0) {
// TODO Auto-generated method stub
PMBean bean = parserPM(arg0);
if(bean!=null){
Log.i("LSD",bean.toString());
}
//关闭
countDownLatch.countDown();
}
});
·定义一个数据跟新完成的接口
//声明对象
private OnParserCallBack callBack;
public interface OnParserCallBack {
public void OnParserComplete(List<HoursWeatherBean> list,
PMBean pmBean, WeatherBean weatherBean);
}
//让主Activity调用,会调
public void setCallBack(OnParserCallBack callback) {
this.callBack = callback;
}
public void removeCallBack() {
callBack = null;
}
// 创建一个内部类,返回当前对象
public class WeatherServiceBinder extends Binder {
public WeatherService getService() {
return WeatherService.this;
}
}
主Activity
当成功启动service服务时:
//获取绑定的方法
ServiceConnection conn=new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
mService.removeCallBack();
}
//绑定成功时候调用的方法
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
//获取service返回来的Ibinder
mService=((WeatherServiceBinder)service).getService();
mService.setCallBack(new OnParserCallBack() {
@Override
public void OnParserComplete(List<HoursWeatherBean> list, PMBean pmBean, WeatherBean weatherBean) {
// TODO Auto-generated method stub
//调用刷新完成方法
mPullToRefreshScrollView.onRefreshComplete();
if (list != null && list.size() >= 5) {
setHourViews(list);
}
if (pmBean != null) {
setPMView(pmBean);
}
if (weatherBean != null) {
setWeatherData(weatherBean);
}
}
});
mService.getCityWeather();
}
};
切换城市:
//通过接口获取城市
private void getCities() {
WeatherData data = WeatherData.getInstance();
data.getCities(new JsonCallBack() {
@Override
public void jsonLoaded(JSONObject json) {
System.out.println(json);
// TODO Auto-generated method stub
try {
int code = json.getInt("resultcode");
int error_code = json.getInt("error_code");
if (error_code == 0 && code == 200) {
list = new ArrayList<String>();
JSONArray resultArray = json.getJSONArray("result");
//创建hashSet用来存放获取到的城市数据
Set<String> citySet = new HashSet<String>();
for (int i = 0; i < resultArray.length(); i++) {
String city = resultArray.getJSONObject(i).getString("city");
citySet.add(city);
}
//这个方法是将citySet中的所有元素都放进list中
list.addAll(citySet);
CityListAdatper adatper = new CityListAdatper(CityActivity.this, list);
lv_city.setAdapter(adatper);
lv_city.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.putExtra("city", list.get(arg2));
setResult(1, intent);
//结束当前这个Activity
finish();
}
});
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
所遇错误
1:在service中将数据放进javabean中。并没有判断javabean是否为空,就调用对象的toString方法,导致程序挂掉。
2布局文件空间太多,会导致思维会乱,漏掉结束标志,导致布局文件出错。应该画布局图,将所有布局以图形的协助,方便分析。
功能描述:
1:主Activity负责显示天气数据的布局
2:Service后台通过聚合数据API获取到天气数据,将数据放进javaBean中
3:主Activity利用javaBean里面的数据填充到具体的布局中
4:城市切换
5:下拉刷新功能
开发流程:
准备阶段:
一:导入聚合数据的jar
二:在AndroidManifest.xml总配置文件中添加相关权限和聚合数据的id
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.READ_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<meta-data
android:name="com.thinkland.juheapi.openid"
android:value="JHe5425b4eb3e7baeede8c687f22dc1ece" />
三:
在调用接口之前需要初始化聚合数据SDK,只需要初始化一次即可。需要在Application中调用初始化方法.
import android.app.Application;
import com.thinkland.juheapi.common.CommonFun;
public class WeatherApplication extends Application{
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
//JuheSDKInitializer.initialize(getApplicationContext());
CommonFun.initialize(getApplicationContext());
}
}
具体开发:
一:主activity加载主布局文件,在oncreate方法中调用initService方法,启动后台服务获取天气信息
WeatherService具体实现:
·通过new一个线程,利用mHandler.sendEmptyMessage(CALLBACK_OK);发送具体城市,
然后handler接收
switch (msg.what) {
case REPEAT_MSG:
//调用getCity方法获取天气数据
getCityWeather();//更新数据
//发送一个延迟消息,30分钟
sendEmptyMessageDelayed(REPEAT_MSG, 30 * 60 * 1000);
break;
·具体的获取天气方法
WeatherData data=WeatherData.getInstance();
data.getByCitys(city, 2, new JsonCallBack() {
@Override
public void jsonLoaded(JSONObject json) {
// TODO Auto-generated method stub
weatherBean = parseWeather(json);
if(weatherBean!=null){
Log.i("LSD",weatherBean.toString());
}
//关闭
countDownLatch.countDown();
}
});
// 获取未来三小时
data.getForecast3h(city, new JsonCallBack() {
@Override
public void jsonLoaded(JSONObject json) {
// TODO Auto-generated method stub
// System.out.println(arg0);
if (json!=null) {
Log.i("LSD","获取未来三小时的json数据:"+json);
}
list = parserForecast3h(json);
if(list!=null){
Log.i("LSD",list.toString());
}
//关闭
countDownLatch.countDown();
}
});
// 接下来设置PM值
AirData airData = AirData.getInstance();
airData.cityAir(city, new JsonCallBack() {
@Override
public void jsonLoaded(JSONObject arg0) {
// TODO Auto-generated method stub
PMBean bean = parserPM(arg0);
if(bean!=null){
Log.i("LSD",bean.toString());
}
//关闭
countDownLatch.countDown();
}
});
·定义一个数据跟新完成的接口
//声明对象
private OnParserCallBack callBack;
public interface OnParserCallBack {
public void OnParserComplete(List<HoursWeatherBean> list,
PMBean pmBean, WeatherBean weatherBean);
}
//让主Activity调用,会调
public void setCallBack(OnParserCallBack callback) {
this.callBack = callback;
}
public void removeCallBack() {
callBack = null;
}
// 创建一个内部类,返回当前对象
public class WeatherServiceBinder extends Binder {
public WeatherService getService() {
return WeatherService.this;
}
}
主Activity
当成功启动service服务时:
//获取绑定的方法
ServiceConnection conn=new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
mService.removeCallBack();
}
//绑定成功时候调用的方法
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
//获取service返回来的Ibinder
mService=((WeatherServiceBinder)service).getService();
mService.setCallBack(new OnParserCallBack() {
@Override
public void OnParserComplete(List<HoursWeatherBean> list, PMBean pmBean, WeatherBean weatherBean) {
// TODO Auto-generated method stub
//调用刷新完成方法
mPullToRefreshScrollView.onRefreshComplete();
if (list != null && list.size() >= 5) {
setHourViews(list);
}
if (pmBean != null) {
setPMView(pmBean);
}
if (weatherBean != null) {
setWeatherData(weatherBean);
}
}
});
mService.getCityWeather();
}
};
切换城市:
//通过接口获取城市
private void getCities() {
WeatherData data = WeatherData.getInstance();
data.getCities(new JsonCallBack() {
@Override
public void jsonLoaded(JSONObject json) {
System.out.println(json);
// TODO Auto-generated method stub
try {
int code = json.getInt("resultcode");
int error_code = json.getInt("error_code");
if (error_code == 0 && code == 200) {
list = new ArrayList<String>();
JSONArray resultArray = json.getJSONArray("result");
//创建hashSet用来存放获取到的城市数据
Set<String> citySet = new HashSet<String>();
for (int i = 0; i < resultArray.length(); i++) {
String city = resultArray.getJSONObject(i).getString("city");
citySet.add(city);
}
//这个方法是将citySet中的所有元素都放进list中
list.addAll(citySet);
CityListAdatper adatper = new CityListAdatper(CityActivity.this, list);
lv_city.setAdapter(adatper);
lv_city.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.putExtra("city", list.get(arg2));
setResult(1, intent);
//结束当前这个Activity
finish();
}
});
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
所遇错误
1:在service中将数据放进javabean中。并没有判断javabean是否为空,就调用对象的toString方法,导致程序挂掉。
2布局文件空间太多,会导致思维会乱,漏掉结束标志,导致布局文件出错。应该画布局图,将所有布局以图形的协助,方便分析。
相关文章推荐
- 安卓开发——服务用法
- 关于一些基础的Java问题的解答(六)
- 前端之旅,做一点有回报的事情
- Python回顾与整理4:序列2—列表与元组
- Linux命令之ls
- 软件开发流程
- PDF 补丁丁 0.5.0.2731 发布(增加去除页面表单和链接水印功能)
- linux下使用tar命令解压.tar.gz文件是参数的说明
- 从关系型数据库看NoSQL的四大特点
- 创建.gitignore文件,忽略不必要提交的文件
- 第四周项目 求sin函数
- 《Thinking in Java》第三篇笔记 Java中的static关键字解析
- HTML DOM基础知识
- 个人机房重构——DataTable与泛型的应用
- 生成格雷码
- 神经网络模型算法与生物神经网络的最新联系
- datawindowchild的GetSQLSelect()方法获取 sql
- HTML5 - Canvas标签<介绍>
- 对datatable进行linq过滤
- javascript——MD5加密脚本