Android网络编程与json解析(天气APP)
简书内容同步:https://www.jianshu.com/u/90ce902439cc
网络编程是安卓开发中必不可少的一个部分,这里会举一个天气APP的例子。
效果如下:
本次网络编程使用的是rxvolley,RxVolley是一个基于Volley的网络请求库;
json数据解析使用的是Google的gson
详细请见:
RxVolley使用文档
RxVolley官方项目地址github
RxVolley缺点:1.图片加载性能一般2.对大资源下载支持不够。由于我们本文只需获取天气信息,资源小没有图片(app中的图片是自己写的逻辑相应配的)
本文使用的接口如下:(和风天气等其他接口返回的数据大同小异不重复介绍)
https://www.apiopen.top/weatherApi?city=湘潭
访问后:
使用下边的网站查看后的效果:
在线json格式化网站
这算是一个较为复杂的json数据了,我们开始用代码获取并解析,放入到APP中吧。
使用Gsonformat生成对应的java对象
GsonFormat是一个Android Studio中的插件,它可以大大提高我们生成Bean类时的速度
图二选中GsonFormat后右边会有个绿色的install按钮,我下载过了所以没显示。
使用插件也很方便,将访问接口的结果复制到剪贴板,新建一个java类,鼠标右键选中Generate后选择GsonFormat,将返回的json数据拷贝进去点击ok即可生成对应的数据类。
以下GsonFormat插件自动生成的代码
package com.lipiao.news;import java.util.List;public class WeatherBean {/*** code : 200* msg : 成功!* data : {"yesterday":{"date":"5日星期二","high":"高温 17℃","fx":"无持续风向","low":"低温 10℃","fl":"<![CDATA[<3级]]>","type":"晴"},"city":"成都","aqi":null,"forecast":[{"date":"6日星期三","high":"高温 15℃","fengli":"<![CDATA[<3级]]>","low":"低温 9℃","fengxiang":"无持续风向","type":"小雨"},{"date":"7日星期四","high":"高温 10℃","fengli":"<![CDATA[<3级]]>","low":"低温 7℃","fengxiang":"无持续风向","type":"小雨"},{"date":"8日星期五","high":"高温 10℃","fengli":"<![CDATA[<3级]]>","low":"低温 7℃","fengxiang":"无持续风向","type":"小雨"},{"date":"9日星期六","high":"高温 15℃","fengli":"<![CDATA[<3级]]>","low":"低温 8℃","fengxiang":"无持续风向","type":"多云"},{"date":"10日星期天","high":"高温 16℃","fengli":"<![CDATA[<3级]]>","low":"低温 9℃","fengxiang":"无持续风向","type":"多云"}],"ganmao":"天冷空气湿度大,易发生感冒,请注意适当增加衣服,加强自我防护避免感冒。","wendu":"10"}*/private int code;private String msg;private DataBean data;public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public DataBean getData() {return data;}public void setData(DataBean data) {this.data = data;}public static class DataBean {/*** yesterday : {"date":"5日星期二","high":"高温 17℃","fx":"无持续风向","low":"低温 10℃","fl":"<![CDATA[<3级]]>","type":"晴"}* city : 成都* aqi : null* forecast : [{"date":"6日星期三","high":"高温 15℃","fengli":"<![CDATA[<3级]]>","low":"低温 9℃","fengxiang":"无持续风向","type":"小雨"},{"date":"7日星期四","high":"高温 10℃","fengli":"<![CDATA[<3级]]>","low":"低温 7℃","fengxiang":"无持续风向","type":"小雨"},{"date":"8日星期五","high":"高温 10℃","fengli":"<![CDATA[<3级]]>","low":"低温 7℃","fengxiang":"无持续风向","type":"小雨"},{"date":"9日星期六","high":"高温 15℃","fengli":"<![CDATA[<3级]]>","low":"低温 8℃","fengxiang":"无持续风向","type":"多云"},{"date":"10日星期天","high":"高温 16℃","fengli":"<![CDATA[<3级]]>","low":"低温 9℃","fengxiang":"无持续风向","type":"多云"}]* ganmao : 天冷空气湿度大,易发生感冒,请注意适当增加衣服,加强自我防护避免感冒。* wendu : 10*/private YesterdayBean yesterday;private String city;private Object aqi;private String ganmao;private String wendu;private List<ForecastBean> forecast;public YesterdayBean getYesterday() {return yesterday;}public void setYesterday(YesterdayBean yesterday) {this.yesterday = yesterday;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}public Object getAqi() {return aqi;}public void setAqi(Object aqi) {this.aqi = aqi;}public String getGanmao() {return ganmao;}public void setGanmao(String ganmao) {this.ganmao = ganmao;}public String getWendu() {return wendu;}public void setWendu(String wendu) {this.wendu = wendu;}public List<ForecastBean> getForecast() {return forecast;}public void setForecast(List<ForecastBean> forecast) {this.forecast = forecast;}public static class YesterdayBean {/*** date : 5日星期二* high : 高温 17℃* fx : 无持续风向* low : 低温 10℃* fl : <![CDATA[<3级]]>* type : 晴*/private String date;private String high;private String fx;private String low;private String fl;private String type;public String getDate() {return date;}public void setDate(String date) {this.date = date;}public String getHigh() {return high;}public void setHigh(String high) {this.high = high;}public String getFx() {return fx;}public void setFx(String fx) {this.fx = fx;}public String getLow() {return low;}public void setLow(String low) {this.low = low;}public String getFl() {return fl;}public void setFl(String fl) {this.fl = fl;}public String getType() {return type;}public void setType(String type) {this.type = type;}}public static class ForecastBean {/*** date : 6日星期三* high : 高温 15℃* fengli : <![CDATA[<3级]]>* low : 低温 9℃* fengxiang : 无持续风向* type : 小雨*/private String date;private String high;private String fengli;private String low;private String fengxiang;private String type;public String getDate() {return date;}public void setDate(String date) {this.date = date;}public String getHigh() {return high;}public void setHigh(String high) {this.high = high;}public String getFengli() {return fengli;}public void setFengli(String fengli) {this.fengli = fengli;}public String getLow() {return low;}public void setLow(String low) {this.low = low;}public String getFengxiang() {return fengxiang;}public void setFengxiang(String fengxiang) {this.fengxiang = fengxiang;}public String getType() {return type;}public void setType(String type) {this.type = type;}}}
}
接下来通过访问网络获取数据以及使用这个类。
1.添加网络访问权限:
<uses-permission android:name="android.permission.INTERNET" />
2.dependencies下导包:
implementation 'com.kymjs.rxvolley:rxvolley:1.1.4'//网络请求
implementation 'com.google.code.gson:gson:2.8.5'//json解析
2.子线程下访问接口获取并解析成对象
private static WeatherBean weatherBean;
private String weatherUrl = "https://www.apiopen.top/weatherApi?city=";
//获取weatherBean
public WeatherBean getWeatherBean() {return weatherBean;}//初始化weatherbean
public void setWeatherBean(String city) {useWeatherApi(weatherUrl + city);}
private void useWeatherApi(String weatherUrl) {try {RxVolley.get(weatherUrl, new HttpCallback() {@Overridepublic void onSuccess(String t) {//解析返回的JSON数据handleWeatherJson(t);}});}//trycatch (Exception e) {//Log.d(TAG, "useApi: 错误");}}//解析json数据(weather)private void handleWeatherJson(String message) {JSONObject jsonObject = null;try {jsonObject = new JSONObject(message);Gson gson = new Gson();weatherBean = gson.fromJson(jsonObject.toString(), WeatherBean.class);} catch (JSONException e) {//Log.d(TAG, "handleWeatherJson: 错误");}}
这样,访问接口返回的json数据就赋给插件自动生成java对象了,需要用的时候就可以很方便的获取数据了,这里我是写了个工具类,总之获取那个WeatherBean对象即可。想用什么数据就get什么即可。
WeatherBean weatherBean= JsonUtil.getJsonUtil().getWeatherBean();
//location
weatherBean.getData().getCity();
//advice
weatherBean.getData().getGanmao();
//省略
//...
APP中每日一句也是同样的方法,数据更简单,这里不再赘述。
使用的是爱词霸的接口:
http://open.iciba.com/dsapi/
本来想上传至小米APP商店的,但…
看来这APP还上不了台面…
于是就上传至蒲公英了,感兴趣的同学欢迎点击下方链接下载或扫描二维码下载
app下载地址
如果觉得文章写得还不错,点个赞呗~