极客学院天气项目总结

极客学院天气项目总结

功能描述:

1:主Activity负责显示天气数据的布局

2Service后台通过聚合数据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(citynew 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(citynew 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.thislist);

lv_city.setAdapter(adatper);

lv_city.setOnItemClickListener(new OnItemClickListener() {

 

@Override

public void onItemClick(AdapterView<?> arg0, View arg1int arg2long 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布局文件空间太多,会导致思维会乱,漏掉结束标志,导致布局文件出错。应该画布局图,将所有布局以图形的协助,方便分析。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值