项目源码请移步:https://github.com/caobaokang419/WeatherApp(欢迎Github Fork&Star,框架和技术实现不妥之处,请帮忙指正),谢谢!
基于MVVM框架的高德天气APP:
功能点实现说明:
- 高德天气查询:Get&Post方式可以正常返回查询高德天气数据并UI显示;
一、 高德天气官方API:
链接:https://lbs.amap.com/api/webservice/guide/api/weatherinfo/
1. 开发步骤:
使用说明
第一步,申请”web服务 API”密钥(Key);
第二步,拼接HTTP请求URL,第一步申请的Key需作为必填参数一同发送;
第三步,接收HTTP请求返回的数据(JSON或XML格式),解析数据。
如无特殊声明,接口的输入参数和输出数据编码全部统一为UTF-8。
2. 天气查询语法:
天气查询
天气查询API服务地址:
URL |
https://restapi.amap.com/v3/weather/weatherInfo?parameters |
请求方式 |
GET |
parameters代表的参数包括必填参数和可选参数。所有参数均使用和号字符(&)进行分隔。下面的列表枚举了这些参数及其使用规则。
- 请求参数
参数名 |
含义 |
规则说明 |
是否必须 |
缺省值 |
|
---|---|---|---|---|---|
key |
请求服务权限标识 |
用户在高德地图官网申请web服务API类型KEY |
必填 |
无 |
|
city |
城市编码 |
输入城市的adcode,adcode信息可参考城市编码表 |
必填 |
无 |
|
extensions |
气象类型 |
可选值:base/all base:返回实况天气 all:返回预报天气 |
可选 |
无 |
|
output |
返回格式 |
可选值:JSON,XML |
可选 |
JSON |
3. 返回的数据格式:
- 返回结果参数说明
实况天气每小时更新多次,预报天气每天更新3次,分别在8、11、18点左右更新。由于天气数据的特殊性以及数据更新的持续性,无法确定精确的更新时间,请以接口返回数据的reporttime字段为准。天气结果对照表>>
名称 |
含义 |
规则说明 |
||
---|---|---|---|---|
status |
返回状态 |
值为0或1 1:成功;0:失败 |
||
count |
返回结果总数目 |
|||
info |
返回的状态信息 |
|||
infocode |
返回状态说明,10000代表正确 |
|||
lives |
实况天气数据信息 |
|||
province |
省份名 |
|||
city |
城市名 |
|||
adcode |
区域编码 |
|||
weather |
天气现象(汉字描述) |
|||
temperature |
实时气温,单位:摄氏度 |
|||
winddirection |
风向描述 |
|||
windpower |
风力级别,单位:级 |
|||
humidity |
空气湿度 |
|||
reporttime |
数据发布的时间 |
|||
forecast |
预报天气信息数据 |
|||
city |
城市名称 |
|||
adcode |
城市编码 |
|||
province |
省份名称 |
|||
reporttime |
预报发布时间 |
|||
casts |
预报数据list结构,元素cast,按顺序为当天、第二天、第三天的预报数据 |
|||
date |
日期 |
|||
week |
星期几 |
|||
dayweather |
白天天气现象 |
|||
nightweather |
晚上天气现象 |
|||
daytemp |
白天温度 |
|||
nighttemp |
晚上温度 |
|||
daywind |
白天风向 |
|||
nightwind |
晚上风向 |
|||
daypower |
白天风力 |
|||
nightpower |
晚上风力 |
4. 高德天气城市配置表:
链接:http://a.amap.com/lbs/static/file/AMap_adcode_citycode.xlsx.zip
5. 请求&返回数据举例:
//restapi.amap.com/v3/weather/weatherInfo?key=您的key&city=110101
{
- "status" :"1",
- "count" :"1",
- "info" :"OK",
- "infocode" :"10000",
- "lives" :[
- "0" :{
- "province" :"北京",
- "city" :"东城区",
- "adcode" :"110101",
- "weather" :"晴",
- "temperature" :"4",
- "winddirection" :"东南",
- "windpower" :"≤3",
- "humidity" :"26",
- "reporttime" :"2019-01-27 13:51:08"
- "0" :{
}
二、 代码实现:
备注:项目源码请移步:https://github.com/caobaokang419/WeatherApp(欢迎Github Fork&Star,框架和技术实现不妥之处,请帮忙指正),谢谢!
1. 查询城市天气请求封装:
/*高德天气:当前天气查询接口 Post*/
public Observable<LiveWeatherResponseData> liveWeatherPost(final String adcode) {
return apiService.livesweatherPost(adcode,
ApiContants.AMAP_USER_KEY_VALUE,
ApiContants.AMAP_USER_EXTENSION_VALUE_BASE,
ApiContants.AMAP_USER_OUTPUT_VALUE)
.subscribeOn(Schedulers.io());
}
/*高德天气:预报天气查询接口 Post*/
public Observable<AllForecastResponseData> forecastWeatherPost(final String adcode) {
return apiService.allweatherPost(adcode,
ApiContants.AMAP_USER_KEY_VALUE,
ApiContants.AMAP_USER_EXTENSION_VALUE_ALL,
ApiContants.AMAP_USER_OUTPUT_VALUE)
.subscribeOn(Schedulers.io());
}
2. 请求发起&返回数据解析:
public void queryCityWeather(final CityBean cityinfo) {
Observable<LiveWeatherResponseData> observable1 =
WeatherRequestClient.getInstance().liveWeatherPost(cityinfo.adcCode).subscribeOn(Schedulers.io());
Observable<AllForecastResponseData> observable2 =
WeatherRequestClient.getInstance().forecastWeatherPost(cityinfo.adcCode).subscribeOn(Schedulers.io());
Observable.zip(observable1, observable2,
new BiFunction<LiveWeatherResponseData, AllForecastResponseData, ArrayList<BaseItemBean>>() {
@Override
public ArrayList<BaseItemBean> apply(LiveWeatherResponseData livedata,
AllForecastResponseData allForecastdata) throws Exception {
List<DayForecastBean> dayForecastList = null;
ArrayList<BaseItemBean> dataList = new ArrayList<>();
dataList.clear();
if (livedata != null && livedata.isSuccessful()) {
dataList.add(livedata.getWeatherLiveResult());
}
if (allForecastdata != null
&& allForecastdata.isSuccessful()
&& allForecastdata.getWeatherAllResult() != null) {
dayForecastList = allForecastdata.getWeatherAllResult().dayForecastBeanList;
}
for (DayForecastBean fdata : dayForecastList) {
dataList.add(fdata);
}
return dataList;
}
}).observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<List<BaseItemBean>>() {
@Override
public void accept(List<BaseItemBean> dataList) throws Exception {
mCityWeatherDatas.put(cityinfo,dataList);
CityWeatherRecyclerAdapter adapter = getCityWeatherRecyclerAdapter(cityinfo);
adapter.setAdapterData(dataList);
}
});
}
具体实现细节,可参照源码,如有疑问和不妥之处,请不吝指教,谢谢!
-------------------------------------------
文章目录(未完,待续):
一:android 应用子功能及移动框架总述 https://blog.csdn.net/cbk861110/article/details/86665564
二:android 高德天气API说明及城市天气查询实现 https://blog.csdn.net/cbk861110/article/details/86665655
三:android 自定义控件实现(ActionBar + PageIndicatorView) https://blog.csdn.net/cbk861110/article/details/86665790
四:android ViewPager实现左右页面滑动切换 https://blog.csdn.net/cbk861110/article/details/86665964
五:android应用权限动态申请 https://blog.csdn.net/cbk861110/article/details/86666321
六:android RecyclerView 封装及使用 https://blog.csdn.net/cbk861110/article/details/86666392
七:android Xutils3文件下载实现(高德天气城市配置) https://blog.csdn.net/cbk861110/article/details/86666573
八:android DiskLruCache 磁盘缓存 封装和使用 https://blog.csdn.net/cbk861110/article/details/86666664
九:android ThreadPoolExecutor线程池 封装及使用 https://blog.csdn.net/cbk861110/article/details/86667101
十:android 天气网络请求框架(retrofit2&okhttp3&Gson) 封装及使用 https://blog.csdn.net/cbk861110/article/details/86667375
十一:android RxAndroid(响应式编程) 异步网络请求实现 https://blog.csdn.net/cbk861110/article/details/86669178
十二:android DataBinding 数据和UI双向绑定实现 https://blog.csdn.net/cbk861110/article/details/86669708
十三:android room数据库 天气数据读写实现 https://blog.csdn.net/cbk861110/article/details/86670354
十四:android LiveData 使用方法(实现城市天气自动刷新) https://blog.csdn.net/cbk861110/article/details/86670531
十五:android ViewModel 使用方法 https://blog.csdn.net/cbk861110/article/details/86670703
十六:android 集成友盟消息推送机制(U-Push) https://blog.csdn.net/cbk861110/article/details/86683849
---------------------
【版权说明】
1. 请支持原创,转载请注明出处:https://blog.csdn.net/cbk861110/article/details/86665564
2. 项目源码&框架说明&技术更新实现 请移步:https://github.com/caobaokang419/WeatherApp(欢迎Github Fork&Star,框架和技术实现不妥之处,请帮忙指正),谢谢!