因为公司项目需要使用到天气信息,而且有国外的使用需求,所以就没有选择国内的信息提供商,而是把目光瞄向了国际化的 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的使用相关推荐

  1. Android MVVM框架搭建(二)OKHttp + Retrofit + RxJava

    Android MVVM框架搭建(二)Retrofit + RxJava 前言 正文 一.引入依赖 二.工具类 三.构建网络框架 1. Base 2. 异常处理 3. 拦截器 4. 网络请求服务 四. ...

  2. Android OkHttp+Retrofit+Rxjava+Hilt 的网络请求封装

    今天给大家简单的封装一个现在比较流行的网络请求框架 第一步是导入我们所需要的依赖还需要在android {}闭包下添加一个 buildFeatures{viewBinding true } imple ...

  3. 0.高仿Android网易云音乐OkHttp+Retrofit+RxJava+Glide+MVC+MVVM

    0.系列文章目录 1.启动界面 2.广告和引导界面 1.项目简介 这是一个使用Java(以后还会推出Kotlin版本)语言,从0开发一个Android平台,接近企业级的项目(我的云音乐),包含了基础内 ...

  4. Android高仿网易云音乐OkHttp+Retrofit+RxJava+Glide+MVC+MVVM

    简介 这是一个使用Java(以后还会推出Kotlin版本)语言,从0开发一个Android平台,接近企业级的项目(我的云音乐),包含了基础内容,高级内容,项目封装,项目重构等知识:主要是使用系统功能, ...

  5. 简单封装OKhttp+Retrofit+Rxjava代马

    相信大家看关于Retrofit的文章,无不列外,比如以下封装形式 public interface UserServiceApi {@POST("api/login")Call&l ...

  6. kotlin for android----------MVP模式下(OKHttp和 Retrofit+RxJava)网络请求的两种实现方式...

    2019独角兽企业重金招聘Python工程师标准>>> 今天要说的干货是:以Kotlin,在MVP模式下(OKHttp和 Retrofit+RxJava)网络请求两种实现方式的一个小 ...

  7. kotterKnife+dagger2+otto+okhttp+picasso+retrofit+rxjava示例项目,使用kotlin编写。

    kotterKnife+dagger2+otto+okhttp+picasso+retrofit+rxjava示例项目,使用kotlin编写. 链接:https://github.com/zengzh ...

  8. (仿有道精品课App)RxJava+OkHttp+Retrofit+Dagger2+MVP框架

    Education An unofficial youdao client for android Remark 该项目为仿有道精品课App的kotlin混编版本,采用rxjava2+okhttp+r ...

  9. java创建请求拦截器_80.简单Retrofit+RxJava+日志拦截器结合使用

    1.需要使用到的依赖如下(Retrofit\RxJava\RecyclerView\日志拦截器) //only Retrofit(只用Retrofit联网) implementation 'io.re ...

最新文章

  1. python命令行参数解析OptionParser类用法实例
  2. open AI 在DOTA 5v5 比赛中战胜职业选手
  3. vue 下echarts卸载和安装指定版本
  4. swift 去json空格_我尽力了,你们快些拿去吧!
  5. VirtualBox COM对象获取失败
  6. python3中property使用方法详解
  7. python的变量名可以是中文吗_Python中用中文变量名、函数名,会影响性能吗?
  8. tushare学习文档_介绍一个python股票分析包tushare——韭菜的自我修养
  9. 极光IM即时通讯初探
  10. 2010年中兴面试题
  11. pytorch 计算模型的GFlops和total params的方法
  12. NEFU 1266 快乐的雨季 (线段树)
  13. BAT解密:互联网技术发展之路(1) - 技术发展的驱动力
  14. Linux线程性能分析和CPU亲和力
  15. HNOI2008玩具装箱(T_OY)bzoj1010
  16. js中有哪几种数据类型
  17. unicode 生僻字_[微软拼音小技巧] 如何用Unicode输入生僻字
  18. 2020第三届江西省高校网络安全技能大赛 线下赛 CTFAWD Writeup
  19. 程序千成不能封闭自满
  20. 微小区v11.1.1 (公众号+小程序模块版)源码安装教程

热门文章

  1. 储能电源/移动电源专用升降压DC-DC方案PL9405
  2. 成品APP直播源码HLS直播(M3U8)回看和下载功能的实现
  3. 《数据结构与算法基础 严蔚敏版》第一章 绪论
  4. delphi在window10下用uniGUI开发isapi的调试方法
  5. PYTHON pygame库实战——实现双人弹球小游戏
  6. houdini节点大全中文手册_【技术贴】武林秘籍在此!大咖座谈虚幻引擎制作影视动画经验!...
  7. authconfig‐tui_openldap(3)linux 、ldap、sssd 认证
  8. Knowledge Graph Convolutional Networks for Recommender Systems with Label Smoothness Regularization
  9. 自动记录电脑开关机时间
  10. 爱她就送ta一场樱花雨