前言

写了上一篇文章,讲了下这个实现天气预报的使用内容,现在又到了看代码的时候,主要还是贴代码,然后添加足够的注释。

聚合数据SDK配置

  • 将juhe_sdk_v_X_X.jar以及armeabi文件夹(内包含libJuheSDK_v_X_X.so)添加到工程中libs文件夹下
  • 打开Moudle setting -> app -> Dependencies,添加juhe_sdk_v_X_X.jar,
  • 在AndroidManifest.xml中,加入所需权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  • 添加所申请的openid(这个是在Juhe官网上申请的).在继承Application类之后, 在AndroidManifest.xml中,加入android:name属性,值为继承Application的类的路径.
  • 初始化聚合数据SDK
import android.app.Application;

public class MyApplication extends Application {

    @Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
JuheSDKInitializer.initialize(getApplicationContext());
}
}

工程代码

MyApplication.java

package com.onlyloveyd.weather;
import android.app.Application;
import com.thinkland.sdk.android.JuheSDKInitializer;
public class MyApplication extends Application {
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
JuheSDKInitializer.initialize(getApplicationContext());//初始化Juhe数据SDK
}
}

城市选择界面

ChooseCityActivity.java

package com.onlyloveyd.weather;
import ......; public class ChooseCityActivity extends Activity { public static final String TAG = "ChooseCityActivity";
@Bind(R.id.tv_choose_city_title)
TextView tvChooseCityTitle;
@Bind(R.id.et_search_city)
EditText etSearchCity;
@Bind(R.id.tv_hotcity)
TextView tvHotcity;
@Bind(R.id.gv_hotcity)
GridView gvHotcity; private ArrayList<CityItem> mSupportCityList;//所有城市List
private ArrayList<CityItem> mSearchCityList;//城市查询结果List
private CityAdapter mCityAdapter;//城市GridView的Adapter @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.citylist);//城市选择界面
ButterKnife.bind(this);//依赖注入 mSupportCityList = new ArrayList<CityItem>();
mSearchCityList = new ArrayList<CityItem>();
//设置带shape模式的编辑框的背景颜色
//GradientDrawable myGrad = (GradientDrawable)mSearchEditView.getBackground();
//myGrad.setColor(getResources().getColor(R.color.choosecitysearchbackground));
//给城市名编译框添加文本变化的观察者
etSearchCity.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { }
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
mSearchCityList.clear();//城市查询结果list清空
String searchkey = charSequence.toString(); Log.e(TAG, " city size " + mSupportCityList.size());
for (int j = 0; j < mSupportCityList.size(); j++) {
CityItem item = mSupportCityList.get(j);
if (searchkey.contains(item.getDistrict()) || item.getDistrict().contains(searchkey)) {//遍历查询
mSearchCityList.add(item);
}
}
mCityAdapter.setCityList(mSearchCityList);
mCityAdapter.notifyDataSetChanged();
} @Override
public void afterTextChanged(Editable editable) {
}
});
mCityAdapter = new CityAdapter(this, mSupportCityList);
gvHotcity.setAdapter(mCityAdapter);
getSupportCity(this);
} private void getSupportCity(Context context) {
/**Juhe SDK 封装的方法
* 请求的方法 参数: 第一个参数 当前请求的context 第二个参数 接口id 第三二个参数 接口请求的url 第 四个参数 接口请求的方式
* 第五个参数 接口请求的参数,键值对com.thinkland.sdk.android.Parameters类型; 第六个参数
* 请求的回调方法,com.thinkland.sdk.android.DataCallBack;
*
*/
JuheData.executeWithAPI(context, 39, "http://v.juhe.cn/weather/citys", JuheData.GET, null, new DataCallBack() {
@Override
public void onSuccess(int statusCode, String responseString) {
try {
//解析JSON数据
JSONObject jsonObject = new JSONObject(responseString);
JSONArray result = jsonObject.getJSONArray("result");
for (int i = 0; i < result.length(); i++) {
JSONObject object = (JSONObject) result.get(i);
CityItem item = new CityItem(object.getString("id"), object.getString("province"), object.getString("city"), object.getString("district"));
mSupportCityList.add(item);//查询结果添加
mCityAdapter.notifyDataSetChanged();//notify数据变化
}
} catch (JSONException e) {
e.printStackTrace();
}
} @Override
public void onFinish() {
} @Override
public void onFailure(int statusCode, String responseString, Throwable throwable) {
Log.e(TAG, responseString);
}
});
} @Override
protected void onResume() {
super.onResume();
} @Override
protected void onPause() {
etSearchCity.setText(null);//避免onBackPress的时候编辑框中还有数据
super.onPause();
}
}

聚合数据针对支持的城市返回的JSON数据格式为

{

“resultcode”:”200”,

“reason”:”successed”,

“result”:[

{

“id”:”1”, /城市ID/

“province”:”北京”,/省份名称/

“city”:”北京”, /城市/

“district”:”北京” /城市/区名称/

},

{

“id”:”2”,

“province”:”北京”,

“city”:”北京”,

“district”:”海淀”

},

}

}

按照这种格式解析出JSON数据

//天气显示界面

WeatherActivity.java

package com.onlyloveyd.weather;
import XXXX; public class WeatherActivity extends Activity { private static final String TAG = "MainActivity";
@Bind(R.id.imageview)
ImageView imageview;
@Bind(R.id.tv_cityname)
TextView tvCityname;
@Bind(R.id.tv_date)
TextView tvDate;
@Bind(R.id.iv_zhengfu)
ImageView ivZhengfu;
@Bind(R.id.iv_tenth)
ImageView ivTenth;
@Bind(R.id.iv_geth)
ImageView ivGeth;
@Bind(R.id.iv_du)
ImageView ivDu;
@Bind(R.id.iv_weather_fa)
ImageView ivWeatherFa;
@Bind(R.id.tv_weather)
TextView tvWeather;
@Bind(R.id.iv_weather_fb)
ImageView ivWeatherFb;
@Bind(R.id.tv_temp)
TextView tvTemp;
@Bind(R.id.tv_humidity)
TextView tvHumidity;
@Bind(R.id.tv_wind)
TextView tvWind;
@Bind(R.id.tv_refreshtime)
TextView tvRefreshtime;
@Bind(R.id.gv_future)
GridView gvFuture;
WeatherInfo.ResultBean.SkBean mSk;
WeatherInfo.ResultBean.TodayBean mToday;
FutureAdapter mFutureAdapter;
ArrayList<WeatherInfo.ResultBean.FutureBean> mFutureList;
private Context mContext;
private String mCityName = null; /**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); mContext = this; requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.weather);
ButterKnife.bind(this);//依赖注入
Intent intent = getIntent();
mCityName = intent.getStringExtra("cityname");//从选择城市界面选择城市传递到这个Activity mFutureList = new ArrayList<WeatherInfo.ResultBean.FutureBean>();//未来7天预报的List
mFutureAdapter = new FutureAdapter(this, mFutureList);//未来天气预报的GridView的Adapter
gvFuture.setAdapter(mFutureAdapter);
} @Override
protected void onResume() {
super.onResume();
mFutureList.clear();
getWeatherInfoByCity(this, mCityName);//查询天气信息,包含的内容比较多,速度还算快,没有单独使用线程
tvCityname.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onBackPressed();
}
});
} private void getWeatherInfoByCity(Context context, String city) { Log.e(TAG, "getWeatherInfoByCity");
Parameters param = new Parameters();
param.add("cityname", city);
param.add("format", 2); JuheData.executeWithAPI(context, 39, "http://v.juhe.cn/weather/index", JuheData.GET, param, new DataCallBack() {
@Override
public void onSuccess(int statusCode, String responseString) {
Gson gson = new Gson();
try {
JSONObject jsonObject = new JSONObject(responseString);
JSONObject resultjson = jsonObject.getJSONObject("result");
JSONObject skjson = resultjson.getJSONObject("sk");
JSONObject todayjson = resultjson.getJSONObject("today");
JSONArray futurejson = resultjson.getJSONArray("future");
mSk = gson.fromJson(skjson.toString(), WeatherInfo.ResultBean.SkBean.class);
mToday = gson.fromJson(todayjson.toString(), WeatherInfo.ResultBean.TodayBean.class);
Log.e(TAG, futurejson.get(2).toString());
for (int i = 0; i < futurejson.length(); i++) {
WeatherInfo.ResultBean.FutureBean futureBean = gson.fromJson(futurejson.get(i).toString(), WeatherInfo.ResultBean.FutureBean.class);
Log.e(TAG, futureBean.toString());
mFutureList.add(futureBean);
}
mFutureAdapter.setmFutureList(mFutureList);
gvFuture.setAdapter(mFutureAdapter);
mFutureAdapter.notifyDataSetChanged(); tvCityname.setText(mCityName);
tvDate.setText(mToday.getDate_y() + " " + mToday.getWeek());
tvWeather.setText(mToday.getWeather());
tvTemp.setText(mToday.getTemperature());
tvHumidity.setText(mSk.getHumidity());
tvWind.setText(mSk.getWind_direction() + " " + mSk.getWind_strength());
tvRefreshtime.setText(getString(R.string.refreshtimesuffix) + mSk.getTime()); String fa = mToday.getWeather_id().getFa();
String fb = mToday.getWeather_id().getFb();
if (fa.equals(fb)) {
ivWeatherFa.setImageResource(getWeatherDrawableByWeatherId("w_", fa));
ivWeatherFb.setImageDrawable(null);
} else {
ivWeatherFa.setImageResource(getWeatherDrawableByWeatherId("w_", fa));
ivWeatherFb.setImageResource(getWeatherDrawableByWeatherId("w_", fb));
} int tmp = Integer.valueOf(mSk.getTemp());
if (tmp < 0) {
ivZhengfu.setImageResource(R.drawable.fuhao);
int tenth = (0 - tmp) / 10;
int geth = (0 - tmp) % 10;
ivTenth.setImageResource(getWeatherDrawableByWeatherId("org4_widget_nw", String.valueOf(tenth)));
ivGeth.setImageResource(getWeatherDrawableByWeatherId("org4_widget_nw", String.valueOf(geth)));
} else {
ivZhengfu.setImageDrawable(null);
int tenth = tmp / 10;
int geth = tmp % 10;
ivTenth.setImageResource(getWeatherDrawableByWeatherId("org4_widget_nw", String.valueOf(tenth)));
ivGeth.setImageResource(getWeatherDrawableByWeatherId("org4_widget_nw", String.valueOf(geth)));
} } catch (JSONException e) {
e.printStackTrace();
} } @Override
public void onFinish() {
// TODO Auto-generated method stub
//Toast.makeText(getApplicationContext(), "finish", Toast.LENGTH_SHORT).show();
} @Override
public void onFailure(int statusCode, String responseString, Throwable throwable) {
// TODO Auto-generated method stub
Log.e(TAG, responseString);
}
});
} private int getWeatherDrawableByWeatherId(String suffix, String fa) {
String res = suffix + fa;
int resid = getResources().getIdentifier(res, "drawable", getPackageName());
return resid;
} @Override
public boolean onTouchEvent(MotionEvent event) {
final int action = event.getAction();
float startX = 0; switch (action) {
case MotionEvent.ACTION_DOWN:
startX = event.getRawX();
break;
case MotionEvent.ACTION_UP:
float endX = event.getRawX();
if ((int) (endX - startX) > 10) {
onBackPressed();
}
break;
default:
break;
} return true;
}
}

具体的内容请查阅源代码:

https://code.csdn.net/poorkick/weatherclient/tree/master

有看不懂的内容可以留言,晚上统一回复。

介绍一个Intellij插件 —– Gson Format, 通过Json格式快速生成Java Bean类,提高开发效率

其实有很多很好用的插件可供选择,不仅可以提高效率,还可以增加自己对开发的兴趣,可以去多了解一下。

谢谢。

<Android 应用 之路> 天气预报(五)的更多相关文章

  1. <Android 应用 之路> 天气预报(四)

    前言 第二次尝试完成天气预报应用,与上次不同的是,个人感觉这次的Ui不那么丑陋,整体的实用性和界面效果,用户体验相较上一次有所提升,但是还是有很多地方需要完善. 这次使用到的内容比较丰富,包括聚合数据 ...

  2. <Android 应用 之路> 天气预报(一)

    Android天气预报客户端 设计思路 欢迎界面,版本号,应用名 + 数据后台加载(所有城市的信息获取) 数据加载完成后跳转到显示界面,显示所有查询到的城市的天气信息 欢迎界面和天气显示界面分别为单独 ...

  3. <Android 应用 之路> 天气预报(三)

    昨天介绍了基本的载入界面,今天介绍下天气信息显示界面的代码 基本ListView显示 搜索框,查询城市 上一篇文章中,载入界面通过showWeatherInfo()方法跳转到天气信息显示界面 priv ...

  4. <Android 应用 之路> 天气预报(二)

    界面组成 载入界面 显示界面 Activity两个,一个用来显示载入界面,一个用来显示天气信息 主要代码如下: public class MyActivity extends Activity { p ...

  5. redis成长之路——(五)

    单例.哨兵.Cluster redis应用广泛,主要体现于实际场景的可用化,但是对于码农来说初步入手很多理念难以理解:码农的想法就是:为什么我要管那么多,我只想用,能用就行!所以必须将三个场景透明化. ...

  6. Android高薪之路-Android程序员面试宝典

    Android高薪之路-Android程序员面试宝典

  7. OpenGL学习之路(五)

    1 引子 不知不觉我们已经进入到读书笔记(五)了,我们先对前四次读书笔记做一个总结.前四次读书笔记主要是学习了如何使用OpenGL来绘制几何图形(包括二维几何体和三维几何体),并学习了平移.旋转.缩放 ...

  8. Android学习之路——简易版微信为例(一)

    这是“Android学习之路”系列文章的开篇,可能会让大家有些失望——这篇文章中我们不介绍简易版微信的实现(不过不是标题党哦,我会在后续博文中一步步实现这个应用程序的).这里主要是和广大园友们聊聊一个 ...

  9. 小猪的Android入门之路 Day 3 - part 3

    小猪的Android入门之路 Day 3 - part 3 各种UI组件的学习 Part 3 本节引言: 在前面两个部分中我们对Android中一些比較经常使用的基本组件进行了一个了解, part 1 ...

随机推荐

  1. Learning Python 011 高级特性 2

    Python 高级特性 2 列表生成式 列表生成式就是指类似这样的代码:[x for x in range(1, 11)] >>> L = [x for x in range(1, ...

  2. Blast 如何使用Blast+(Linux)转载

    下载数据 #此处下载对应物种的数据库ftp://ftp.ncbi.nih.gov/genomes/,下载fna格式的即可   wget ftp://ftp.ncbi.nih.gov/genomes/A ...

  3. poj 1410 Intersection (判断线段与矩形相交 判线段相交)

    题目链接 Intersection Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12040   Accepted: 312 ...

  4. [Xcode 实际操作]四、常用控件-(17)为MKMapView地图上显示提示框

    目录:[Swift]Xcode实际操作 本文将演示当点击地图上的标注圆点时,弹出信息窗口. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit ...

  5. 我的省选 Day -13

    Day -13 10:18:46 早上360浏览器的网站一直显示 证书错误! 打开洛谷,一脸懵逼,网页根本不能正常显示.(一直到刚刚改了一下系统时间才恢复正常) 好在已经把昨天那道矩阵乘法的题目做完了 ...

  6. Multi-catch parameters are not allowed for source level below 1.7 报错处理

    有可能是你项目右键build-path里面的这个东西 在项目上右键properties->project Facets->修改右侧的version  保持一致 还有一个就是Window里面 ...

  7. python 3.x 安装问题及连接oracle数据库

    最近有用到python去处理一些问题,发现现在3已出来,遂用直接下3.7使用 发现问题还是有一点的 1. pip 会出现ssl问题 Could not install packages due to ...

  8. iconfont的应用

    http://www.iconfont.cn/help/platform.html http://www.iconfont.cn/users/project 点击下载之后: 打开demo.html: ...

  9. PHP根据经纬度计算距离

    思路: 公式: W为纬度对应的弧度,J为经度对应的弧度,如上图所示 下面代码  lat是纬度  lng是经度 /** * 根据经纬度算距离,返回结果单位是公里,先纬度,后经度 * @param $la ...

  10. CodeForces - 589A

    题目链接:http://codeforces.com/problemset/problem/589/A Polycarp has quite recently learned about email ...