<Android 应用 之路> 天气预报(五)
前言
写了上一篇文章,讲了下这个实现天气预报的使用内容,现在又到了看代码的时候,主要还是贴代码,然后添加足够的注释。
聚合数据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 应用 之路> 天气预报(五)的更多相关文章
- <Android 应用 之路> 天气预报(四)
前言 第二次尝试完成天气预报应用,与上次不同的是,个人感觉这次的Ui不那么丑陋,整体的实用性和界面效果,用户体验相较上一次有所提升,但是还是有很多地方需要完善. 这次使用到的内容比较丰富,包括聚合数据 ...
- <Android 应用 之路> 天气预报(一)
Android天气预报客户端 设计思路 欢迎界面,版本号,应用名 + 数据后台加载(所有城市的信息获取) 数据加载完成后跳转到显示界面,显示所有查询到的城市的天气信息 欢迎界面和天气显示界面分别为单独 ...
- <Android 应用 之路> 天气预报(三)
昨天介绍了基本的载入界面,今天介绍下天气信息显示界面的代码 基本ListView显示 搜索框,查询城市 上一篇文章中,载入界面通过showWeatherInfo()方法跳转到天气信息显示界面 priv ...
- <Android 应用 之路> 天气预报(二)
界面组成 载入界面 显示界面 Activity两个,一个用来显示载入界面,一个用来显示天气信息 主要代码如下: public class MyActivity extends Activity { p ...
- redis成长之路——(五)
单例.哨兵.Cluster redis应用广泛,主要体现于实际场景的可用化,但是对于码农来说初步入手很多理念难以理解:码农的想法就是:为什么我要管那么多,我只想用,能用就行!所以必须将三个场景透明化. ...
- Android高薪之路-Android程序员面试宝典
Android高薪之路-Android程序员面试宝典
- OpenGL学习之路(五)
1 引子 不知不觉我们已经进入到读书笔记(五)了,我们先对前四次读书笔记做一个总结.前四次读书笔记主要是学习了如何使用OpenGL来绘制几何图形(包括二维几何体和三维几何体),并学习了平移.旋转.缩放 ...
- Android学习之路——简易版微信为例(一)
这是“Android学习之路”系列文章的开篇,可能会让大家有些失望——这篇文章中我们不介绍简易版微信的实现(不过不是标题党哦,我会在后续博文中一步步实现这个应用程序的).这里主要是和广大园友们聊聊一个 ...
- 小猪的Android入门之路 Day 3 - part 3
小猪的Android入门之路 Day 3 - part 3 各种UI组件的学习 Part 3 本节引言: 在前面两个部分中我们对Android中一些比較经常使用的基本组件进行了一个了解, part 1 ...
随机推荐
- Linux/Unix 指令使用说明的格式介绍(the Bash Command 'Usage' Syntax)
Linux/Unix 指令使用说明的格式介绍(the Bash Command 'Usage' Syntax) 摘自 金马的Blog 原文 http://www.lijinma.com/blo ...
- [转]hadoop运行mapreduce作业无法连接0.0.0.0/0.0.0.0:10020
14/04/04 17:15:12 INFO mapreduce.Job: map 0% reduce 0% 14/04/04 17:19:42 INFO mapreduce.Job: map 4 ...
- JavaScript学习系列1 基础-变量
1. 在一次面试中,被问到JavaScript中使用严格模式有什么区别, 这里的严格模式指的是 ECMAScript5严格模式 我们首先来看看普通模式,也就是非严格模式 a = 5; console. ...
- NPM run start使用本地的http-server
在项目开发过程中,Visual Studio 2015 一个Solution中有一个前端项目 Myproject.FrontEnd,我们使用node.js, npm来进行管理 在这个项目中,有一个pa ...
- ASP.NET WebForm中JavaScript修改了页面上Label的值,如何在后台代码中获取
在用ASP.NET WebForm开发一个项目时,遇到如下的一个情况 页面上有一个Textbox控件,还有2个Label 控件. 当Textbox控件中的值更改时,两个Label控件上的值做相应的更改 ...
- PureUI(扩展版本)
喜欢一个UI(pure,官网)不怎么更新(可能官方认为不需要更新).我自己做了扩展和修正,整个库下载地址:http://files.cnblogs.com/files/RainbowInTheSky/ ...
- SCUT - 289 - 小O的数字 - 数位dp
https://scut.online/p/289 一个水到飞起的模板数位dp. #include<bits/stdc++.h> using namespace std; typedef ...
- vue里的tab标签
<template> <div class="Test2"> <div class="tabs_wrap" v-model=&qu ...
- 算法学习分析-点分治 HDU 6269 Master of Subgraph
首先给出定义 点分治是一种处理树上路径的工具 挂出一道题目来:Master of Subgraph 这道题目让你求所有联通子图加和所能产生数字,问你1到m之间,那些数字可以被产生 这道题目,假如我们利 ...
- Eclipse中新建Maven Web项目报错:The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
在maven web项目中的index.jsp中的错误信息如下: The superclass "javax.servlet.http.HttpServlet" was not f ...