ACCU天气API以及Okhttp、Retrofit、RxJava的使用
因为公司项目需要使用到天气信息,而且有国外的使用需求,所以就没有选择国内的信息提供商,而是把目光瞄向了国际化的 ACCUWeather。通过下面的两个链接,我们可以简单的了解到AccuWeather的信息和他提供的api。
ACCUWeather简介
ACCU API网站
我这里主要使用到两个访问URL:
请求城市编码:
http://dataservice.accuweather.com/locations/v1/cities/geoposition/search?apikey=APIKEY&q=GEOLOCATION&language=LANGUAGE
请求当前天气数据:
http://dataservice.accuweather.com/currentconditions/v1/LOCATIONKEY?apikey=APIKEY&language=LANGUAGE&details=true上面URL中全大写字母的单词都是要替换的字符串
APIKEY: 在AccuWeather 开发者网站申请的应用key
GEOLOCATION: 定位获取到的经纬度数据, 格式是:”经度,纬度”。 由于本文主要是讲解天气API和网络相关的,所以定位获取的内容请自行学习。
LANGUAGE:请求想返回的数据的语言。 AccuWeather提供了有限的支持的语言列表,可以自行查询是否支持你想要的语言。查询支持的语言
AccuWeather 还有很多其他的如天气预报等API,需要的可以自行查询。
下面开始说说Okhttp和Retrofit
Okhttp、Retrofi和RxJava都是目前很盛行的Android开发框架,网络上面也有很多博客和网站讲解了,我这里就不详细讲解原理了,重点是使用。 一言不合就贴代码。
先使用Okhttp来获取数据
//构造查询城市信息的URL
private String findCityByGeoLocation(String geolocation, String lang, boolean withLang) {StringBuilder builder = new StringBuilder();builder.append("http://dataservice.accuweather.com/locations/v1/cities/geoposition/search?").append("apikey=").append(APIKEY).append("&q=").append(geolocation);if (withLang) {builder.append("&language=").append(lang);}String string = builder.toString();Log.d(TAG, "findCityByGeoLocation: " + string);return string;}
//获取JsonObject中的key
private int getLocationKey(String response) {int key = -1;try {JSONObject object = new JSONObject(response);if (object.has("Key")) {key = object.getInt("Key");}} catch (JSONException e) {e.printStackTrace();}return key;
}//使用Okhttp查询城市信息
private void findCityByOkHttp() {OkHttpClient client = new OkHttpClient.Builder().build();final Request request = new Request.Builder().url(findCityByGeoLocation(GEOLOCATION, "en", false)).build();okhttp3.Call call = client.newCall(request);call.enqueue(new okhttp3.Callback() {@Overridepublic void onFailure(okhttp3.Call call, IOException e) {Log.d(TAG, "onFailure: " + e.getMessage());}@Overridepublic void onResponse(okhttp3.Call call, okhttp3.Response response) throws IOException {String result = response.body().string();int code = response.code();Log.d(TAG, "onResponse: " + code + ", " + result);//使用查询到的LocationKey 查询天气信息currentWeatherByOkHttp(getLocationKey(result));}});
}
//使用Okhttp查询天气信息
private void currentWeatherByOkHttp(int locationKey) {StringBuilder sb = new StringBuilder();sb.append("http://dataservice.accuweather.com/currentconditions/v1/").append(locationKey).append("?").append("apikey=").append(APIKEY).append("&").append("language=en&").append("details=true");String url = sb.toString();OkHttpClient client = new OkHttpClient();final Request request = new Request.Builder().url(url).build();okhttp3.Call call = client.newCall(request);call.enqueue(new okhttp3.Callback() {@Overridepublic void onFailure(okhttp3.Call call, IOException e) {Log.d(TAG, "onFailure: " + e.getMessage());}@Overridepublic void onResponse(okhttp3.Call call, okhttp3.Response response) throws IOException {Log.d(TAG, "onResponse: " + response.body().string());}});
}
上面使用Okhttp的代码其实很简单,只有两步操作,第一,先获取城市编码;第二,通过城市编码获取天气数据。使用Okhttp已经如此简洁了,那使用Retrofit岂不是更爽。
使用Retrofit请求数据
CityService.java
public interface CityService {@GET("locations/v1/cities/geoposition/search")Call<CityBean> getCityString(@QueryMap Map<String, String> map);
}
WeatherService.java
public interface WeatherService {@Headers("Accept-Encoding: application/json")@GET("currentconditions/v1/{locationKey}")Call<List<WeatherBean>> currentWeather(@Path("locationKey") String locationKey, @QueryMap() Map<String, String> map);
}
NetWork.java
//定义的方便进行网络操作的工具类
public class NetWork {private static final String ACCU_URL = "http://dataservice.accuweather.com/";private static final int CONNECT_TIME_OUT = 20;private static final int READ_TIME_OUT = 20;private static final int WRITE_TIME_OUT = 20;private static CityApi sCityApi;private static WeatherApi sWeatherApi;private static CityService sCityService;private static WeatherService sWeatherService;private static OkHttpClient sOkHttpClient;private static GsonConverterFactory gsonConverterFactory = GsonConverterFactory.create();private static RxJavaCallAdapterFactory rxJavaCallAdapterFactory = RxJavaCallAdapterFactory.create();private static NetWork sInstance;private NetWork() {sOkHttpClient = new OkHttpClient.Builder().connectTimeout(CONNECT_TIME_OUT, TimeUnit.SECONDS).readTimeout(READ_TIME_OUT, TimeUnit.SECONDS).build();}public static NetWork getInstance() {if (sInstance == null) {synchronized (NetWork.class) {if (sInstance == null) {sInstance = new NetWork();}}}return sInstance;}public WeatherApi getWeatherApi() {if (sWeatherApi == null) {Retrofit retrofit = new Retrofit.Builder().baseUrl(ACCU_URL).client(sOkHttpClient).addConverterFactory(gsonConverterFactory).addCallAdapterFactory(rxJavaCallAdapterFactory).build();sWeatherApi = retrofit.create(WeatherApi.class);}return sWeatherApi;}public CityApi getCityApi() {if (sCityApi == null) {Retrofit retrofit = new Retrofit.Builder().baseUrl(ACCU_URL).client(sOkHttpClient).addConverterFactory(gsonConverterFactory).addCallAdapterFactory(rxJavaCallAdapterFactory).build();sCityApi = retrofit.create(CityApi.class);}return sCityApi;}public CityService getCityService() {if (sCityService == null) {Retrofit retrofit = new Retrofit.Builder().baseUrl(ACCU_URL).client(sOkHttpClient).addConverterFactory(gsonConverterFactory).addCallAdapterFactory(rxJavaCallAdapterFactory).build();sCityService = retrofit.create(CityService.class);}return sCityService;}public WeatherService getWeatherService() {if (sWeatherService == null) {Retrofit retrofit = new Retrofit.Builder().baseUrl(ACCU_URL).client(sOkHttpClient).addConverterFactory(gsonConverterFactory).addCallAdapterFactory(rxJavaCallAdapterFactory).build();sWeatherService = retrofit.create(WeatherService.class);}return sWeatherService;}
}
MainActivity.java
private void findCityByRetrofit() {Map<String, String> map = new HashMap<>();map.put("apikey", APIKEY);map.put("q", GEOLOCATION);map.put("language", "en");NetWork.getInstance().getCityService().getCityString(map).enqueue(new Callback<CityBean>() {@Overridepublic void onResponse(Call<CityBean> call, Response<CityBean> response) {String key = response.body().getKey();Log.d(TAG, "onResponse: " + key);currentWeatherByRetrofit(key);}@Overridepublic void onFailure(Call<CityBean> call, Throwable t) {Log.e(TAG, "onFailure: " + t.getMessage());}});}private void currentWeatherByRetrofit(String locationKey) {String language = "en";Map<String, String> map = new HashMap<>();map.put("apikey", APIKEY);map.put("language", language);map.put("details", "true");NetWork.getInstance().getWeatherService().currentWeather(locationKey, map).enqueue(new Callback<List<WeatherBean>>() {@Overridepublic void onResponse(Call<List<WeatherBean>> call, Response<List<WeatherBean>> response) {Log.d(TAG, "onResponse: " + response.body().get(0).toString());}@Overridepublic void onFailure(Call<List<WeatherBean>> call, Throwable t) {Log.e(TAG, "onFailure: " + t.getMessage());}});}
使用了Retrofit之后,我们想RxJava作为目前最火爆的框架之一,能不能加入到我们的项目中呢。
Retrofit + RxJava
CityApi.java
//定义City接口
public interface CityApi {@GET("locations/v1/cities/geoposition/search")Observable<CityBean> getCityString(@QueryMap Map<String, String> map);
}
WeatherApi.java
//定义Weather接口
public interface WeatherApi {@GET("currentconditions/v1/{locationKey}")Observable<List<WeatherBean>> currentWeather(@Path("locationKey") String locationKey,@QueryMap() Map<String, String> map);
}
MainActivity.java
private void findCityByRetrofitRxJava() {Map<String, String> map = new HashMap<>();map.put("apikey", APIKEY);map.put("q", GEOLOCATION);map.put("language", "en");NetWork.getInstance().getCityApi().getCityString(map).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<CityBean>() {@Overridepublic void onCompleted() {}@Overridepublic void onError(Throwable e) {Log.e(TAG, "findCityByRetrofitRxJava onError: " + e.getLocalizedMessage());}@Overridepublic void onNext(CityBean cityBean) {if (cityBean != null) {String key = cityBean.getKey();//to update weatherLog.d(TAG, "onNext: " + cityBean.toString());currentWeatherByRetrofitRxJava(cityBean);}}});}private void currentWeatherByRetrofitRxJava(CityBean cityBean) {String language = "en";Map<String, String> map = new HashMap<>();map.put("apikey", APIKEY);map.put("language", language);map.put("details", "false");NetWork.getInstance().getWeatherApi().currentWeather(cityBean.getKey(), map).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<List<WeatherBean>>() {@Overridepublic void onCompleted() {}@Overridepublic void onError(Throwable e) {Log.e(TAG, "currentWeatherByRetrofitRxJava onError: " + e.getMessage());}@Overridepublic void onNext(List<WeatherBean> lists) {int size = lists.size();WeatherBean bean = lists.get(0);Log.d(TAG, "onNext: " + "size: " + size + "" + bean.toString());}});}
GitHub:代码
本文只是个人工作学习中的知识回顾和记录,如有问题请指出。谢谢。
ACCU天气API以及Okhttp、Retrofit、RxJava的使用相关推荐
- Android MVVM框架搭建(二)OKHttp + Retrofit + RxJava
Android MVVM框架搭建(二)Retrofit + RxJava 前言 正文 一.引入依赖 二.工具类 三.构建网络框架 1. Base 2. 异常处理 3. 拦截器 4. 网络请求服务 四. ...
- Android OkHttp+Retrofit+Rxjava+Hilt 的网络请求封装
今天给大家简单的封装一个现在比较流行的网络请求框架 第一步是导入我们所需要的依赖还需要在android {}闭包下添加一个 buildFeatures{viewBinding true } imple ...
- 0.高仿Android网易云音乐OkHttp+Retrofit+RxJava+Glide+MVC+MVVM
0.系列文章目录 1.启动界面 2.广告和引导界面 1.项目简介 这是一个使用Java(以后还会推出Kotlin版本)语言,从0开发一个Android平台,接近企业级的项目(我的云音乐),包含了基础内 ...
- Android高仿网易云音乐OkHttp+Retrofit+RxJava+Glide+MVC+MVVM
简介 这是一个使用Java(以后还会推出Kotlin版本)语言,从0开发一个Android平台,接近企业级的项目(我的云音乐),包含了基础内容,高级内容,项目封装,项目重构等知识:主要是使用系统功能, ...
- 简单封装OKhttp+Retrofit+Rxjava代马
相信大家看关于Retrofit的文章,无不列外,比如以下封装形式 public interface UserServiceApi {@POST("api/login")Call&l ...
- kotlin for android----------MVP模式下(OKHttp和 Retrofit+RxJava)网络请求的两种实现方式...
2019独角兽企业重金招聘Python工程师标准>>> 今天要说的干货是:以Kotlin,在MVP模式下(OKHttp和 Retrofit+RxJava)网络请求两种实现方式的一个小 ...
- kotterKnife+dagger2+otto+okhttp+picasso+retrofit+rxjava示例项目,使用kotlin编写。
kotterKnife+dagger2+otto+okhttp+picasso+retrofit+rxjava示例项目,使用kotlin编写. 链接:https://github.com/zengzh ...
- (仿有道精品课App)RxJava+OkHttp+Retrofit+Dagger2+MVP框架
Education An unofficial youdao client for android Remark 该项目为仿有道精品课App的kotlin混编版本,采用rxjava2+okhttp+r ...
- java创建请求拦截器_80.简单Retrofit+RxJava+日志拦截器结合使用
1.需要使用到的依赖如下(Retrofit\RxJava\RecyclerView\日志拦截器) //only Retrofit(只用Retrofit联网) implementation 'io.re ...
最新文章
- python命令行参数解析OptionParser类用法实例
- open AI 在DOTA 5v5 比赛中战胜职业选手
- vue 下echarts卸载和安装指定版本
- swift 去json空格_我尽力了,你们快些拿去吧!
- VirtualBox COM对象获取失败
- python3中property使用方法详解
- python的变量名可以是中文吗_Python中用中文变量名、函数名,会影响性能吗?
- tushare学习文档_介绍一个python股票分析包tushare——韭菜的自我修养
- 极光IM即时通讯初探
- 2010年中兴面试题
- pytorch 计算模型的GFlops和total params的方法
- NEFU 1266 快乐的雨季 (线段树)
- BAT解密:互联网技术发展之路(1) - 技术发展的驱动力
- Linux线程性能分析和CPU亲和力
- HNOI2008玩具装箱(T_OY)bzoj1010
- js中有哪几种数据类型
- unicode 生僻字_[微软拼音小技巧] 如何用Unicode输入生僻字
- 2020第三届江西省高校网络安全技能大赛 线下赛 CTFAWD Writeup
- 程序千成不能封闭自满
- 微小区v11.1.1 (公众号+小程序模块版)源码安装教程
热门文章
- 储能电源/移动电源专用升降压DC-DC方案PL9405
- 成品APP直播源码HLS直播(M3U8)回看和下载功能的实现
- 《数据结构与算法基础 严蔚敏版》第一章 绪论
- delphi在window10下用uniGUI开发isapi的调试方法
- PYTHON pygame库实战——实现双人弹球小游戏
- houdini节点大全中文手册_【技术贴】武林秘籍在此!大咖座谈虚幻引擎制作影视动画经验!...
- authconfig‐tui_openldap(3)linux 、ldap、sssd 认证
- Knowledge Graph Convolutional Networks for Recommender Systems with Label Smoothness Regularization
- 自动记录电脑开关机时间
- 爱她就送ta一场樱花雨