Android 天气APP(十九)更换新版API接口(更高、更快、更强)(1)

public String getTemp() {

return temp;

}

public void setTemp(String temp) {

this.temp = temp;

}

public String getIcon() {

return icon;

}

public void setIcon(String icon) {

this.icon = icon;

}

public String getText() {

return text;

}

public void setText(String text) {

this.text = text;

}

public String getWind360() {

return wind360;

}

public void setWind360(String wind360) {

this.wind360 = wind360;

}

public String getWindDir() {

return windDir;

}

public void setWindDir(String windDir) {

this.windDir = windDir;

}

public String getWindScale() {

return windScale;

}

public void setWindScale(String windScale) {

this.windScale = windScale;

}

public String getWindSpeed() {

return windSpeed;

}

public void setWindSpeed(String windSpeed) {

this.windSpeed = windSpeed;

}

public String getHumidity() {

return humidity;

}

public void setHumidity(String humidity) {

this.humidity = humidity;

}

public String getPop() {

return pop;

}

public void setPop(String pop) {

this.pop = pop;

}

public String getPrecip() {

return precip;

}

public void setPrecip(String precip) {

this.precip = precip;

}

public String getPressure() {

return pressure;

}

public void setPressure(String pressure) {

this.pressure = pressure;

}

public String getCloud() {

return cloud;

}

public void setCloud(String cloud) {

this.cloud = cloud;

}

public String getDew() {

return dew;

}

public void setDew(String dew) {

this.dew = dew;

}

}

}

4. 空气质量API

/**

  • 当天空气质量

  • @param location 城市名

  • @return 返回当天空气质量数据

*/

@GET(“/v7/air/now?key=3086e91d66c04ce588a7f538f917c7f4”)

Call airNowWeather(@Query(“location”) String location);

AirNowResponse.java代码如下:

package com.llw.goodweather.bean;

import java.util.List;

/**

  • 当天空气质量数据实体

*/

public class AirNowResponse {

/**

  • code : 200

  • updateTime : 2020-07-15T09:34+08:00

  • fxLink : http://hfx.link/2ax4

  • now : {“pubTime”:“2020-07-15T09:00+08:00”,“aqi”:“49”,“category”:“优”,“primary”:“NA”,“pm10”:“49”,“pm2p5”:“29”,“no2”:“20”,“so2”:“3”,“co”:“0.6”,“o3”:“84”}

  • station : [{“pubTime”:“2020-07-15T09:00+08:00”,“name”:“万寿西宫”,“id”:“CNA1001”,“aqi”:“68”,“level”:“2”,“category”:“良”,“primary”:“PM2.5”,“pm10”:“66”,“pm2p5”:“49”,“no2”:“29”,“so2”:“3”,“co”:“0.7”,“o3”:“81”},{“pubTime”:“2020-07-15T09:00+08:00”,“name”:“定陵”,“id”:“CNA1002”,“aqi”:“36”,“level”:“1”,“category”:“优”,“primary”:“NA”,“pm10”:“36”,“pm2p5”:“15”,“no2”:“11”,“so2”:“3”,“co”:“0.4”,“o3”:“84”},{“pubTime”:“2020-07-15T09:00+08:00”,“name”:“东四”,“id”:“CNA1003”,“aqi”:“46”,“level”:“1”,“category”:“优”,“primary”:“NA”,“pm10”:“44”,“pm2p5”:“32”,“no2”:“21”,“so2”:“3”,“co”:“0.9”,“o3”:“95”},{“pubTime”:“2020-07-15T09:00+08:00”,“name”:“天坛”,“id”:“CNA1004”,“aqi”:“57”,“level”:“2”,“category”:“良”,“primary”:“PM2.5”,“pm10”:“56”,“pm2p5”:“40”,“no2”:“18”,“so2”:“1”,“co”:“0.7”,“o3”:“96”},{“pubTime”:“2020-07-15T09:00+08:00”,“name”:“农展馆”,“id”:“CNA1005”,“aqi”:“55”,“level”:“2”,“category”:“良”,“primary”:“PM10”,“pm10”:“59”,“pm2p5”:“35”,“no2”:“26”,“so2”:“3”,“co”:“0.7”,“o3”:“79”},{“pubTime”:“2020-07-15T09:00+08:00”,“name”:“官园”,“id”:“CNA1006”,“aqi”:“53”,“level”:“2”,“category”:“良”,“primary”:“PM2.5”,“pm10”:“52”,“pm2p5”:“37”,“no2”:“24”,“so2”:“1”,“co”:“0.6”,“o3”:“91”},{“pubTime”:“2020-07-15T09:00+08:00”,“name”:“海淀区万柳”,“id”:“CNA1007”,“aqi”:“48”,“level”:“1”,“category”:“优”,“primary”:“NA”,“pm10”:“48”,“pm2p5”:“28”,“no2”:“28”,“so2”:“1”,“co”:“0.6”,“o3”:“79”},{“pubTime”:“2020-07-15T09:00+08:00”,“name”:“顺义新城”,“id”:“CNA1008”,“aqi”:“46”,“level”:“1”,“category”:“优”,“primary”:“NA”,“pm10”:“46”,“pm2p5”:“22”,“no2”:“15”,“so2”:“3”,“co”:“0.5”,“o3”:“85”},{“pubTime”:“2020-07-15T09:00+08:00”,“name”:“怀柔镇”,“id”:“CNA1009”,“aqi”:“43”,“level”:“1”,“category”:“优”,“primary”:“NA”,“pm10”:“43”,“pm2p5”:“22”,“no2”:“18”,“so2”:“3”,“co”:“0.5”,“o3”:“78”},{“pubTime”:“2020-07-15T09:00+08:00”,“name”:“昌平镇”,“id”:“CNA1010”,“aqi”:“53”,“level”:“2”,“category”:“良”,“primary”:“PM10”,“pm10”:“56”,“pm2p5”:“23”,“no2”:“21”,“so2”:“1”,“co”:“0.5”,“o3”:“68”},{“pubTime”:“2020-07-15T09:00+08:00”,“name”:“奥体中心”,“id”:“CNA1011”,“aqi”:“44”,“level”:“1”,“category”:“优”,“primary”:“NA”,“pm10”:“44”,“pm2p5”:“22”,“no2”:“17”,“so2”:“3”,“co”:“0.5”,“o3”:“89”},{“pubTime”:“2020-07-15T09:00+08:00”,“name”:“古城”,“id”:“CNA1012”,“aqi”:“32”,“level”:“1”,“category”:“优”,“primary”:“NA”,“pm10”:“28”,“pm2p5”:“22”,“no2”:“11”,“so2”:“3”,“co”:“0.5”,“o3”:“80”}]

  • refer : {“sources”:[“cnemc”],“license”:[“no commercial use”]}

*/

private String code;

private String updateTime;

private String fxLink;

private NowBean now;

private ReferBean refer;

private List station;

public String getCode() {

return code;

}

public void setCode(String code) {

this.code = code;

}

public String getUpdateTime() {

return updateTime;

}

public void setUpdateTime(String updateTime) {

this.updateTime = updateTime;

}

public String getFxLink() {

return fxLink;

}

public void setFxLink(String fxLink) {

this.fxLink = fxLink;

}

public NowBean getNow() {

return now;

}

public void setNow(NowBean now) {

this.now = now;

}

public ReferBean getRefer() {

return refer;

}

public void setRefer(ReferBean refer) {

this.refer = refer;

}

public List getStation() {

return station;

}

public void setStation(List station) {

this.station = station;

}

public static class NowBean {

/**

  • pubTime : 2020-07-15T09:00+08:00

  • aqi : 49

  • category : 优

  • primary : NA

  • pm10 : 49

  • pm2p5 : 29

  • no2 : 20

  • so2 : 3

  • co : 0.6

  • o3 : 84

*/

private String pubTime;

private String aqi;

private String category;

private String primary;

private String pm10;

private String pm2p5;

private String no2;

private String so2;

private String co;

private String o3;

public String getPubTime() {

return pubTime;

}

public void setPubTime(String pubTime) {

this.pubTime = pubTime;

}

public String getAqi() {

return aqi;

}

public void setAqi(String aqi) {

this.aqi = aqi;

}

public String getCategory() {

return category;

}

public void setCategory(String category) {

this.category = category;

}

public String getPrimary() {

return primary;

}

public void setPrimary(String primary) {

this.primary = primary;

}

public String getPm10() {

return pm10;

}

public void setPm10(String pm10) {

this.pm10 = pm10;

}

public String getPm2p5() {

return pm2p5;

}

public void setPm2p5(String pm2p5) {

this.pm2p5 = pm2p5;

}

public String getNo2() {

return no2;

}

public void setNo2(String no2) {

this.no2 = no2;

}

public String getSo2() {

return so2;

}

public void setSo2(String so2) {

this.so2 = so2;

}

public String getCo() {

return co;

}

public void setCo(String co) {

this.co = co;

}

public String getO3() {

return o3;

}

public void setO3(String o3) {

this.o3 = o3;

}

}

public static class ReferBean {

private List sources;

private List license;

public List getSources() {

return sources;

}

public void setSources(List sources) {

this.sources = sources;

}

public List getLicense() {

return license;

}

public void setLicense(List license) {

this.license = license;

}

}

public static class StationBean {

/**

  • pubTime : 2020-07-15T09:00+08:00

  • name : 万寿西宫

  • id : CNA1001

  • aqi : 68

  • level : 2

  • category : 良

  • primary : PM2.5

  • pm10 : 66

  • pm2p5 : 49

  • no2 : 29

  • so2 : 3

  • co : 0.7

  • o3 : 81

*/

private String pubTime;

private String name;

private String id;

private String aqi;

private String level;

private String category;

private String primary;

private String pm10;

private String pm2p5;

private String no2;

private String so2;

private String co;

private String o3;

public String getPubTime() {

return pubTime;

}

public void setPubTime(String pubTime) {

this.pubTime = pubTime;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getAqi() {

return aqi;

}

public void setAqi(String aqi) {

this.aqi = aqi;

}

public String getLevel() {

return level;

}

public void setLevel(String level) {

this.level = level;

}

public String getCategory() {

return category;

}

public void setCategory(String category) {

this.category = category;

}

public String getPrimary() {

return primary;

}

public void setPrimary(String primary) {

this.primary = primary;

}

public String getPm10() {

return pm10;

}

public void setPm10(String pm10) {

this.pm10 = pm10;

}

public String getPm2p5() {

return pm2p5;

}

public void setPm2p5(String pm2p5) {

this.pm2p5 = pm2p5;

}

public String getNo2() {

return no2;

}

public void setNo2(String no2) {

this.no2 = no2;

}

public String getSo2() {

return so2;

}

public void setSo2(String so2) {

this.so2 = so2;

}

public String getCo() {

return co;

}

public void setCo(String co) {

this.co = co;

}

public String getO3() {

return o3;

}

public void setO3(String o3) {

this.o3 = o3;

}

}

}

5. 生活指数API

/**

  • 生活指数

  • @param type 可以控制定向获取那几项数据 全部数据 0, 运动指数 1 ,洗车指数 2 ,穿衣指数 3 ,

  •         钓鱼指数	4 ,紫外线指数  5 ,旅游指数  6,花粉过敏指数	7,舒适度指数	8,
    
  •         感冒指数	9 ,空气污染扩散条件指数	10 ,空调开启指数	 11 ,太阳镜指数	12 ,
    
  •         化妆指数  13 ,晾晒指数  14 ,交通指数  15 ,防晒指数	16
    
  • @param location 城市名

  • @return 返回当前生活指数数据

  • @return

*/

@GET(“/v7/indices/1d?key=3086e91d66c04ce588a7f538f917c7f4”)

Call Lifestyle(@Query(“type”) String type,

@Query(“location”) String location);

LifestyleResponse.java代码如下:

package com.llw.goodweather.bean;

import java.util.List;

/**

  • 生活指数

*/

public class LifestyleResponse {

/**

  • code : 200

  • updateTime : 2020-07-15T09:10+08:00

  • fxLink : http://hfx.link/2ax2

  • daily : [{“date”:“2020-07-15”,“type”:“13”,“name”:“化妆指数”,“level”:“4”,“category”:“防脱水防晒”,“text”:“天气炎热,用防脱水防晒指数高的化妆品,少用粉底,常补粉。”},{“date”:“2020-07-15”,“type”:“6”,“name”:“旅游指数”,“level”:“1”,“category”:“适宜”,“text”:“天气较好,但丝毫不会影响您的心情。微风,虽天气稍热,却仍适宜旅游,不要错过机会呦!”},{“date”:“2020-07-15”,“type”:“14”,“name”:“晾晒指数”,“level”:“2”,“category”:“适宜”,“text”:“天气不错,适宜晾晒。赶紧把久未见阳光的衣物搬出来吸收一下太阳的味道吧!”},{“date”:“2020-07-15”,“type”:“15”,“name”:“交通指数”,“level”:“1”,“category”:“良好”,“text”:“天气较好,路面干燥,交通气象条件良好,车辆可以正常行驶。”},{“date”:“2020-07-15”,“type”:“10”,“name”:“空气污染扩散条件指数”,“level”:“2”,“category”:“中”,“text”:“气象条件对空气污染物稀释、扩散和清除无明显影响。”},{“date”:“2020-07-15”,“type”:“3”,“name”:“穿衣指数”,“level”:“7”,“category”:“炎热”,“text”:“天气炎热,建议着短衫、短裙、短裤、薄型T恤衫等清凉夏季服装。”},{“date”:“2020-07-15”,“type”:“16”,“name”:“防晒指数”,“level”:“2”,“category”:“极强”,“text”:“紫外辐射极强,应特别加强防护,建议涂擦SPF20以上,PA++的防晒护肤品,并随时补涂。”},{“date”:“2020-07-15”,“type”:“4”,“name”:“钓鱼指数”,“level”:“2”,“category”:“较适宜”,“text”:“较适合垂钓,但风力稍大,会对垂钓产生一定的影响。”},{“date”:“2020-07-15”,“type”:“5”,“name”:“紫外线指数”,“level”:“5”,“category”:“很强”,“text”:“紫外线辐射极强,建议涂擦SPF20以上、PA++的防晒护肤品,尽量避免暴露于日光下。”},{“date”:“2020-07-15”,“type”:“11”,“name”:“空调开启指数”,“level”:“2”,“category”:“部分时间开启”,“text”:“天气热,到中午的时候您将会感到有点热,因此建议在午后较热时开启制冷空调。”},{“date”:“2020-07-15”,“type”:“12”,“name”:“太阳镜指数”,“level”:“4”,“category”:“很必要”,“text”:“白天虽有白云遮挡,但太阳辐射仍很强,建议佩戴透射比2级且标注UV400的遮阳镜”},{“date”:“2020-07-15”,“type”:“7”,“name”:“过敏指数”,“level”:“2”,“category”:“不易发”,“text”:“天气条件不易诱发过敏,除特殊体质外,无需担心过敏问题。”},{“date”:“2020-07-15”,“type”:“8”,“name”:“舒适度指数”,“level”:“3”,“category”:“较不舒适”,“text”:“白天天气多云,同时会感到有些热,不很舒适。”},{“date”:“2020-07-15”,“type”:“9”,“name”:“感冒指数”,“level”:“1”,“category”:“少发”,“text”:“各项气象条件适宜,发生感冒机率较低。但请避免长期处于空调房间中,以防感冒。”},{“date”:“2020-07-15”,“type”:“2”,“name”:“洗车指数”,“level”:“2”,“category”:“较适宜”,“text”:“较适宜洗车,未来一天无雨,风力较小,擦洗一新的汽车至少能保持一天。”},{“date”:“2020-07-15”,“type”:“1”,“name”:“运动指数”,“level”:“2”,“category”:“较适宜”,“text”:“天气较好,较适宜进行各种运动,但因天气热,请适当减少运动时间,降低运动强度。”}]

  • refer : {“sources”:[“Weather China”],“license”:[“no commercial use”]}

*/

private String code;

private String updateTime;

private String fxLink;

private ReferBean refer;

private List daily;

public String getCode() {

return code;

}

public void setCode(String code) {

this.code = code;

}

public String getUpdateTime() {

return updateTime;

}

public void setUpdateTime(String updateTime) {

this.updateTime = updateTime;

}

public String getFxLink() {

return fxLink;

}

public void setFxLink(String fxLink) {

this.fxLink = fxLink;

}

public ReferBean getRefer() {

return refer;

}

public void setRefer(ReferBean refer) {

this.refer = refer;

}

public List getDaily() {

return daily;

}

public void setDaily(List daily) {

this.daily = daily;

}

public static class ReferBean {

private List sources;

private List license;

public List getSources() {

return sources;

}

public void setSources(List sources) {

this.sources = sources;

}

public List getLicense() {

return license;

}

public void setLicense(List license) {

this.license = license;

}

}

public static class DailyBean {

/**

  • date : 2020-07-15

  • type : 13

  • name : 化妆指数

  • level : 4

  • category : 防脱水防晒

  • text : 天气炎热,用防脱水防晒指数高的化妆品,少用粉底,常补粉。

*/

private String date;

private String type;

private String name;

private String level;

private String category;

private String text;

public String getDate() {

return date;

}

public void setDate(String date) {

this.date = date;

}

public String getType() {

return type;

}

public void setType(String type) {

this.type = type;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getLevel() {

return level;

}

public void setLevel(String level) {

this.level = level;

}

public String getCategory() {

return category;

}

public void setCategory(String category) {

this.category = category;

}

public String getText() {

return text;

}

public void setText(String text) {

this.text = text;

}

}

}

6. 搜索城市API

/**

  • 搜索城市 V7版本 模糊搜索,国内范围 返回10条数据

  • @param location 城市名

  • @param mode exact 精准搜索 fuzzy 模糊搜索

  • @return

*/

@GET(“/v2/city/lookup?key=3086e91d66c04ce588a7f538f917c7f4&range=cn”)

Call newSearchCity(@Query(“location”) String location,

@Query(“mode”) String mode);

NewSearchCityResponse.java代码如下:

package com.llw.goodweather.bean;

import java.util.List;

public class NewSearchCityResponse {

/**

  • status : 200

  • location : [{“name”:“北京”,“id”:“101010100”,“lat”:“39.90498”,“lon”:“116.40528”,“adm2”:“北京”,“adm1”:“北京”,“country”:“中国”,“tz”:“Asia/Shanghai”,“utcOffset”:“+08:00”,“isDst”:“0”,“type”:“city”,“rank”:“10”,“fxLink”:“http://hfx.link/2ax1”},{“name”:“朝阳”,“id”:“101010300”,“lat”:“39.92148”,“lon”:“116.48641”,“adm2”:“北京”,“adm1”:“北京”,“country”:“中国”,“tz”:“Asia/Shanghai”,“utcOffset”:“+08:00”,“isDst”:“0”,“type”:“city”,“rank”:“15”,“fxLink”:“http://hfx.link/2az1”},{“name”:“海淀”,“id”:“101010200”,“lat”:“39.95607”,“lon”:“116.31031”,“adm2”:“北京”,“adm1”:“北京”,“country”:“中国”,“tz”:“Asia/Shanghai”,“utcOffset”:“+08:00”,“isDst”:“0”,“type”:“city”,“rank”:“15”,“fxLink”:“http://hfx.link/2ay1”},{“name”:“丰台”,“id”:“101010900”,“lat”:“39.86364”,“lon”:“116.28696”,“adm2”:“北京”,“adm1”:“北京”,“country”:“中国”,“tz”:“Asia/Shanghai”,“utcOffset”:“+08:00”,“isDst”:“0”,“type”:“city”,“rank”:“25”,“fxLink”:“http://hfx.link/2b51”},{“name”:“大兴”,“id”:“101011100”,“lat”:“39.72890”,“lon”:“116.33803”,“adm2”:“北京”,“adm1”:“北京”,“country”:“中国”,“tz”:“Asia/Shanghai”,“utcOffset”:“+08:00”,“isDst”:“0”,“type”:“city”,“rank”:“25”,“fxLink”:“http://hfx.link/2b71”},{“name”:“房山”,“id”:“101011200”,“lat”:“39.73553”,“lon”:“116.13916”,“adm2”:“北京”,“adm1”:“北京”,“country”:“中国”,“tz”:“Asia/Shanghai”,“utcOffset”:“+08:00”,“isDst”:“0”,“type”:“city”,“rank”:“23”,“fxLink”:“http://hfx.link/2b81”},{“name”:“通州”,“id”:“101010600”,“lat”:“39.90248”,“lon”:“116.65859”,“adm2”:“北京”,“adm1”:“北京”,“country”:“中国”,“tz”:“Asia/Shanghai”,“utcOffset”:“+08:00”,“isDst”:“0”,“type”:“city”,“rank”:“23”,“fxLink”:“http://hfx.link/2b21”},{“name”:“石景山”,“id”:“101011000”,“lat”:“39.91460”,“lon”:“116.19544”,“adm2”:“北京”,“adm1”:“北京”,“country”:“中国”,“tz”:“Asia/Shanghai”,“utcOffset”:“+08:00”,“isDst”:“0”,“type”:“city”,“rank”:“35”,“fxLink”:“http://hfx.link/2b61”},{“name”:“昌平”,“id”:“101010700”,“lat”:“40.21808”,“lon”:“116.23590”,“adm2”:“北京”,“adm1”:“北京”,“country”:“中国”,“tz”:“Asia/Shanghai”,“utcOffset”:“+08:00”,“isDst”:“0”,“type”:“city”,“rank”:“23”,“fxLink”:“http://hfx.link/2b31”},{“name”:“顺义”,“id”:“101010400”,“lat”:“40.12893”,“lon”:“116.65352”,“adm2”:“北京”,“adm1”:“北京”,“country”:“中国”,“tz”:“Asia/Shanghai”,“utcOffset”:“+08:00”,“isDst”:“0”,“type”:“city”,“rank”:“33”,“fxLink”:“http://hfx.link/2b01”}]

  • refer : {“sources”:[“heweather.com”],“license”:[“commercial license”]}

*/

private String status;

private ReferBean refer;

private List location;

public String getStatus() {

return status;

}

public void setStatus(String status) {

this.status = status;

}

public ReferBean getRefer() {

return refer;

}

public void setRefer(ReferBean refer) {

this.refer = refer;

}

public List getLocation() {

return location;

}

public void setLocation(List location) {

this.location = location;

}

public static class ReferBean {

private List sources;

private List license;

public List getSources() {

return sources;

}

public void setSources(List sources) {

this.sources = sources;

}

public List getLicense() {

return license;

}

public void setLicense(List license) {

this.license = license;

}

}

public static class LocationBean {

/**

  • name : 北京

  • id : 101010100

  • lat : 39.90498

  • lon : 116.40528

  • adm2 : 北京

  • adm1 : 北京

  • country : 中国

  • tz : Asia/Shanghai

  • utcOffset : +08:00

  • isDst : 0

  • type : city

  • rank : 10

  • fxLink : http://hfx.link/2ax1

*/

private String name;

private String id;

private String lat;

private String lon;

private String adm2;

private String adm1;

private String country;

private String tz;

private String utcOffset;

private String isDst;

private String type;

private String rank;

private String fxLink;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getLat() {

return lat;

}

public void setLat(String lat) {

this.lat = lat;

}

public String getLon() {

return lon;

}

public void setLon(String lon) {

this.lon = lon;

}

public String getAdm2() {

return adm2;

}

public void setAdm2(String adm2) {

this.adm2 = adm2;

}

public String getAdm1() {

return adm1;

}

public void setAdm1(String adm1) {

this.adm1 = adm1;

}

public String getCountry() {

return country;

}

public void setCountry(String country) {

this.country = country;

}

public String getTz() {

return tz;

}

public void setTz(String tz) {

this.tz = tz;

}

public String getUtcOffset() {

return utcOffset;

}

public void setUtcOffset(String utcOffset) {

this.utcOffset = utcOffset;

}

public String getIsDst() {

return isDst;

}

public void setIsDst(String isDst) {

this.isDst = isDst;

}

public String getType() {

return type;

}

public void setType(String type) {

this.type = type;

}

public String getRank() {

return rank;

}

public void setRank(String rank) {

this.rank = rank;

}

public String getFxLink() {

return fxLink;

}

public void setFxLink(String fxLink) {

this.fxLink = fxLink;

}

}

}

没有的实体你创建一个就好了,然后将代码复制进去即可。API写好之后,就可以来一个一个的改代码了。这里我没有写上热门城市的API,是因为我打算给这个里面整体改头换面一下,以适应新的V7API的使用。

③ 修改订阅器
1. 修改WeatherContract

首先当然是主页面的订阅器啦,打开WeatherContract.java

可以到看里面目前是三个方法,

在这里插入图片描述

除了必应的壁纸请求,其他两个就负责主页面的数据请求,这个两个方法你可以先注释掉或者删掉了。

现在增加S7版本的方法,这里面增加了六个方法

/**

  • 搜索城市 V7版本中 需要把定位城市的id查询出来,然后通过这个id来查询详细的数据

  • @param location 城市名

*/

public void newSearchCity(String location) {//注意这里的4表示新的搜索城市地址接口

ApiService service = ServiceGenerator.createService(ApiService.class, 4);//指明访问的地址

service.newSearchCity(location,“exact”).enqueue(new NetCallBack() {

@Override

public void onSuccess(Call call, Response response) {

if(getView() != null){

getView().getNewSearchCityResult(response);

}

}

@Override

public void onFailed() {

if(getView() != null){

getView().getDataFailed();

}

}

});

}

/**

  • 实况天气 V7版本

  • @param location 城市名

*/

public void nowWeather(String location){//这个3 表示使用新的V7API访问地址

ApiService service = ServiceGenerator.createService(ApiService.class,3);

service.nowWeather(location).enqueue(new NetCallBack() {

@Override

public void onSuccess(Call call, Response response) {

if(getView() != null){

getView().getNowResult(response);

}

}

@Override

public void onFailed() {

if(getView() != null){

getView().getWeatherDataFailed();

}

}

});

}

/**

  • 天气预报 V7版本 7d 表示天气的数据 为了和之前看上去差别小一些,这里先用七天的

  • @param location 城市名

*/

public void dailyWeather(String location){//这个3 表示使用新的V7API访问地址

ApiService service = ServiceGenerator.createService(ApiService.class,3);

service.dailyWeather(“7d”,location).enqueue(new NetCallBack() {

@Override

public void onSuccess(Call call, Response response) {

if(getView() != null){

getView().getDailyResult(response);

}

}

@Override

public void onFailed() {

if(getView() != null){

getView().getWeatherDataFailed();

}

}

});

}

/**

  • 逐小时预报(未来24小时)

  • @param location 城市名

*/

public void hourlyWeather(String location){

ApiService service = ServiceGenerator.createService(ApiService.class,3);

service.hourlyWeather(location).enqueue(new NetCallBack() {

@Override

public void onSuccess(Call call, Response response) {

if(getView() != null){

getView().getHourlyResult(response);

}

}

@Override

public void onFailed() {

if(getView() != null){

getView().getWeatherDataFailed();

}

}

});

}

/**

  • 当天空气质量

  • @param location 城市名

*/

public void airNowWeather(String location){

ApiService service = ServiceGenerator.createService(ApiService.class,3);

service.airNowWeather(location).enqueue(new NetCallBack() {

@Override

public void onSuccess(Call call, Response response) {

if(getView() != null){

getView().getAirNowResult(response);

}

}

@Override

public void onFailed() {

if(getView() != null){

getView().getWeatherDataFailed();

}

}

});

}

/**

  • 生活指数

  • @param location 城市名 type中的"1,2,3,5,6,8,9,10",表示只获取这8种类型的指数信息,同样是为了对应之前的界面UI

*/

public void lifestyle(String location){

ApiService service = ServiceGenerator.createService(ApiService.class,3);

service.lifestyle(“1,2,3,5,6,8,9,10”,location).enqueue(new NetCallBack() {

@Override

public void onSuccess(Call call, Response response) {

if(getView() != null){

getView().getLifestyleResult(response);

}

}

@Override

public void onFailed() {

if(getView() != null){

getView().getWeatherDataFailed();

}

}

});

}

在这里插入图片描述

代码如下:

/* 以下为V7版本新增 */

//搜索城市返回城市id 通过id才能查下面的数据,否则会提示400 V7

void getNewSearchCityResult(Response response);

//实况天气

void getNowResult(Response response);

//天气预报 7天

void getDailyResult(Response response);

//逐小时天气预报

void getHourlyResult(Response response);

//空气质量

void getAirNowResult(Response response);

//生活指数

void getLifestyleResult(Response response);

看我的博客你甚至都不用写代码,粘贴复制就可以了,但我还是你能自己写一下。这个时候,如果你打开MainActivity肯定是会报错的,不过不用担心,这是因为刚才新增的没有在MainActivity中实现,后面再一起实现它们,订阅器可不止一个,

2. 修改SearchCityContract

现在打开SearchCityContract.java,新增如下代码:

/**

  • 搜索城市 V7版本中 模糊搜索 返回10条相关数据

  • @param location 城市名

*/

public void newSearchCity(String location) {//注意这里的4表示新的搜索城市地址接口

ApiService service = ServiceGenerator.createService(ApiService.class, 4);//指明访问的地址

service.newSearchCity(location,“fuzzy”).enqueue(new NetCallBack() {

@Override

public void onSuccess(Call call, Response response) {

if(getView() != null){

getView().getNewSearchCityResult(response);

}

}

@Override

public void onFailed() {

if(getView() != null){

getView().getDataFailed();

}

}

});

}

接口中

//搜索城市返回数据 V7

void getNewSearchCityResult(Response response);

最终如下图所示

在这里插入图片描述

OK,现在订阅器都改好了,可以到Activity里面做修改了。

④ 修改Activity
1. 修改MainActivity

打开MainActivity,首先找到

在这里插入图片描述

刚才在订阅器里面已经注释掉或者删除了,所以这里没有找到对应方法,这两个你可以删除或者注释,我是删除了。

同样你还需要将

在这里插入图片描述

这两个请求在页面上有五件,我建议先注释掉,现在找到报错这一行。

在这里插入图片描述

然后会出现一个弹窗,里面会选中6个方法,点击OK就会导入进来,这个时候你的页面就不会再有报错的了。

现在可以在各个方法返回中写入数据了,一个一个来吧。首先是getNewSearchCityResult

在写之前,要做一些简单的代码改动,

打开CodeToStringUtils,增加返回状态码的判断处理,S6和V7是不一样的。所以要增加V7的。

在这里插入图片描述

增加的代码如下:

//新增V7版本下的状态码判断

case “204”:

codeInfo = “你查询的地区暂时没有你需要的数据”;

break;

case “400”:

codeInfo = “请求错误,可能包含错误的请求参数或缺少必选的请求参数”;

break;

case “401”:

codeInfo = “认证失败,可能使用了错误的KEY、数字签名错误、KEY的类型错误”;

break;

case “402”:

codeInfo = “超过访问次数或余额不足以支持继续访问服务,你可以充值、升级访问量或等待访问量重置。”;

break;

case “403”:

codeInfo = “无访问权限,可能是绑定的PackageName、BundleID、域名IP地址不一致,或者是需要额外付费的数据。”;

break;

case “404”:

codeInfo = “查询的数据或地区不存在。”;

break;

case “429”:

codeInfo = “超过限定的QPM(每分钟访问次数)”;

break;

你只要放进去就可以了,然后再修改一下Constant,将里面的SUCCESS_CODE改成String类型,值改为“200”,这里还是要吐槽一下,状态码为什么不用Int类型呢?。

改完后如下图所示

在这里插入图片描述

在和风 V7 API中,我们并不能通过城市的名称直接拿到相关的数据,需要通过城市的id或者坐标来获取相关的天气预报、逐小时天气、空气质量等等一些其他数据,当然了,百度定位是可以拿到坐标的,完全可以跳过搜索城市这一步,但我还是写了这一步,因为这还涉及到其他页面返回的数据需要查询天气信息的,而其他页面又不是定位得到的,所以还是要查询出城市id的。

这里我定义一个变量用于接收城市id

在这里插入图片描述

private String locationId = null;//城市id,用于查询城市数据 V7版本 中 才有

然后看搜索城市的返回处理

/**

  • 和风天气 V7 API

  • 通过定位到的地址 / 城市切换得到的地址 都需要查询出对应的城市id才行,所以在V7版本中,这是第一步接口

  • @param response

*/

@Override

public void getNewSearchCityResult(Response response) {

refresh.finishRefresh();//关闭刷新

dismissLoadingDialog();//关闭弹窗

if (mLocationClient != null) {

mLocationClient.stop();//数据返回后关闭定位

}

if (response.body().getStatus().equals(Constant.SUCCESS_CODE)) {

if (response.body().getLocation() != null && response.body().getLocation().size() > 0) {

tvCity.setText(response.body().getLocation().get(0).getName());//城市

locationId = response.body().getLocation().get(0).getId();//城市Id

showLoadingDialog();

mPresent.nowWeather(locationId);//查询实况天气

mPresent.dailyWeather(locationId);//查询天气预报

mPresent.hourlyWeather(locationId);//查询逐小时天气预报

mPresent.airNowWeather(locationId);//空气质量

mPresent.lifestyle(locationId);//生活指数

} else {

ToastUtils.showShortToast(context, “数据为空”);

}

} else {

tvCity.setText(“查询城市失败”);

ToastUtils.showShortToast(context, CodeToStringUtils.WeatherCode(response.body().getStatus()));

}

}

相信你应该能看懂,在返回中做数据处理,得到城市id之后再去请求其他的数据,虽然请求比较多,但速度比之前的是要快的,这个也是V7相对于S6的优势之一。

还有一个就是V7请求返回值中,所有相关时间都是格林尼治时间。而不是我们常规使用的那种时间格式。所以我特地写了一个方法用于转换,在DateUtils中新增如下方法:

在这里插入图片描述

代码如下:

//根据传入的时间,先转换再截取,得到更新时间 传入 “2020-07-16T09:39+08:00”

@RequiresApi(api = Build.VERSION_CODES.O)

public static String updateTime(String dateTime) {

String result = null;

LocalDateTime date = LocalDateTime.parse(dateTime, DateTimeFormatter.ISO_OFFSET_DATE_TIME);

String dateString = date.format(DateTimeFormatter.ofPattern(“yyyy-MM-dd HH:mm”));

System.out.println(“dateString:”+dateString);//到这一步,时间格式已经转换好了

result = dateString.substring(11);//进一步截取以达到我项目中的需求

return result;

}

还有一点要说明一下这种转换方法是要在Android API26及以上才行,所以只要加上一个版本指定注解就可以,

@RequiresApi(api = Build.VERSION_CODES.O)

那么编译器在编译这个方法的时候就会以26的版本去编译,这样你既不用更改build.gradle中的最低API版本也不用担心报错。

现在来看getNowResult方法

/**

  • 实况天气数据返回 V7

  • @param response

*/

@RequiresApi(api = Build.VERSION_CODES.O)

@Override

public void getNowResult(Response response) {

dismissLoadingDialog();

if (response.body().getCode().equals(Constant.SUCCESS_CODE)) {//200则成功返回数据

//根据V7版本的原则,只要是200就一定有数据,我们可以不用做判空处理,但是,为了使程序不ANR,还是要做的,信自己得永生

NowResponse data = response.body();

if (data != null) {

tvTemperature.setText(data.getNow().getTemp());//温度

if (flag) {

ivLocation.setVisibility(View.VISIBLE);//显示定位图标

} else {

ivLocation.setVisibility(View.GONE);//显示定位图标

}

tvInfo.setText(data.getNow().getText());//天气状况

String time = DateUtils.updateTime(data.getUpdateTime());//截去前面的字符,保留后面所有的字符,就剩下 22:00

tvOldTime.setText(“上次更新时间:” + WeatherUtil.showTimeInfo(time) + time);

tvWindDirection.setText("风向 " + data.getNow().getWindDir());//风向

tvWindPower.setText("风力 " + data.getNow().getWindScale() + “级”);//风力

wwBig.startRotate();//大风车开始转动

wwSmall.startRotate();//小风车开始转动

} else {

ToastUtils.showShortToast(context, “暂无实况天气数据”);

}

} else {//其他状态返回提示文字

ToastUtils.showShortToast(context, CodeToStringUtils.WeatherCode(response.body().getCode()));

}

}

当你写到哪一步发现的报错是我博客中没有提高的,请尽快告诉我,我会及时补上,对自己写的东西负责,也对后面看博客的朋友负责。

现在在adapter包新建一个DailyAdapter.java文件

这是天气预报数据适配器,里面代码如下:

package com.llw.goodweather.adapter;

import android.widget.ImageView;

import androidx.annotation.Nullable;

import com.chad.library.adapter.base.BaseQuickAdapter;

import com.chad.library.adapter.base.BaseViewHolder;

import com.llw.goodweather.R;

import com.llw.goodweather.bean.DailyResponse;

import com.llw.goodweather.utils.WeatherUtil;

import java.util.List;

/**

  • V7 API 天气预报数据列表适配器

*/

public class DailyAdapter extends BaseQuickAdapter<DailyResponse.DailyBean, BaseViewHolder> {

public DailyAdapter(int layoutResId, @Nullable List<DailyResponse.DailyBean> data) {

super(layoutResId, data);

}

@Override

protected void convert(BaseViewHolder helper, DailyResponse.DailyBean item) {

helper.setText(R.id.tv_date, item.getFxDate())//日期

.setText(R.id.tv_low_and_height, item.getTempMin() + “/” + item.getTempMax() + “℃”);//最低温和最高温

//天气状态图片

ImageView weatherStateIcon = helper.getView(R.id.iv_weather_state);

int code = Integer.parseInt(item.getIconDay());//获取天气状态码,根据状态码来显示图标

WeatherUtil.changeIcon(weatherStateIcon,code);//调用工具类中写好的方法

helper.addOnClickListener(R.id.item_forecast);//绑定点击事件的id

}

}

再创建一个HourlyAdapter.java文件,作为逐小时天气预报适配器,代码如下:

package com.llw.goodweather.adapter;

import android.os.Build;

import android.widget.ImageView;

import androidx.annotation.Nullable;

import androidx.annotation.RequiresApi;

import com.chad.library.adapter.base.BaseQuickAdapter;

import com.chad.library.adapter.base.BaseViewHolder;

import com.llw.goodweather.R;

import com.llw.goodweather.bean.HourlyResponse;

import com.llw.goodweather.utils.DateUtils;

import com.llw.goodweather.utils.WeatherUtil;

import java.util.List;

/**

  • V7 API 逐小时预报数据列表适配器

*/

public class HourlyAdapter extends BaseQuickAdapter<HourlyResponse.HourlyBean, BaseViewHolder> {

public HourlyAdapter(int layoutResId, @Nullable List<HourlyResponse.HourlyBean> data) {

super(layoutResId, data);

}

@RequiresApi(api = Build.VERSION_CODES.O)

@Override

protected void convert(BaseViewHolder helper, HourlyResponse.HourlyBean item) {

//首先是对时间格式的处理,因为拿到的时间是 2020-04-28 22:00 要改成 晚上22:00

//分两步,第一个是字符串的截取,第二个是时间段的判断返回文字描述

/**

  • V7 API 涉及到时间的,都会返回 2020-07-16T09:39+08:00 这种格式

  • 所以最好写一个通用的返回进行处理 方法已经写好了使用可以了

*/

String time = DateUtils.updateTime(item.getFxTime());

helper.setText(R.id.tv_time, WeatherUtil.showTimeInfo(time) + time)//时间

.setText(R.id.tv_temperature, item.getTemp() + “℃”);//温度

//天气状态图片

ImageView weatherStateIcon = helper.getView(R.id.iv_weather_state);

int code = Integer.parseInt(item.getIcon());//获取天气状态码,根据状态码来显示图标

WeatherUtil.changeIcon(weatherStateIcon, code);

helper.addOnClickListener(R.id.item_hourly);

}

}

这里没有问题之后,回到MainActivity

在这里插入图片描述

你可以将原来的列表适配器代码注释掉或者删掉。

//V7 版本

List<DailyResponse.DailyBean> dailyListV7 = new ArrayList<>();//天气预报数据列表

DailyAdapter mAdapterDailyV7;//天气预报适配器

List<HourlyResponse.HourlyBean> hourlyListV7 = new ArrayList<>();//逐小时天气预报数据列表

HourlyAdapter mAdapterHourlyV7;//逐小时预报适配器

然后再看到initList,先将里面的代码都注释掉或者删掉,然后新增

在这里插入图片描述

新增的代码如下:

/** V7 版本 **/

//天气预报 7天

mAdapterDailyV7 = new DailyAdapter(R.layout.item_weather_forecast_list, dailyListV7);

rv.setLayoutManager(new LinearLayoutManager(this));

rv.setAdapter(mAdapterDailyV7);

//天气预报列表item点击事件

mAdapterDailyV7.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {

@Override

public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {

DailyResponse.DailyBean data = dailyListV7.get(position);

showForecastWindow(data);

}

});

//逐小时天气预报 24小时

mAdapterHourlyV7 = new HourlyAdapter(R.layout.item_weather_hourly_list, hourlyListV7);

LinearLayoutManager managerHourly = new LinearLayoutManager(context);

managerHourly.setOrientation(RecyclerView.HORIZONTAL);//设置列表为横向

rvHourly.setLayoutManager(managerHourly);

rvHourly.setAdapter(mAdapterHourlyV7);

//逐小时天气预报列表item点击事件

mAdapterHourlyV7.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {

@RequiresApi(api = Build.VERSION_CODES.O)

@Override

public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {

//赋值

HourlyResponse.HourlyBean data = hourlyListV7.get(position);

//小时天气详情弹窗

showHourlyWindow(data);

}

});

然后你就会发现showForecastWindowshowHourlyWindow这两个方法报错,是因为传递的数据变了,对应不上,现在来看看这两个方法吧。在这之前,先简单改动一下window_forecast_detail.xml这个弹窗的布局文件

在这里插入图片描述

可以删掉了,

在这里插入图片描述

然后新增

<LinearLayout

android:gravity=“center_vertical”

android:layout_width=“match_parent”

android:layout_height=“0dp”

android:layout_weight=“1”>

<TextView

android:text=“云量”

android:textColor=“@color/black”

android:layout_width=“0dp”

android:layout_weight=“1”

android:layout_height=“wrap_content”/>

<TextView

android:textColor=“@color/black”

android:id=“@+id/tv_cloud”

android:layout_width=“0dp”

android:layout_weight=“1”

android:layout_height=“wrap_content”/>

再回到MainActivityshowForecastWindow方法处

在这里插入图片描述

在这里插入图片描述

方法代码如下

//显示天气预报详情弹窗

private void showForecastWindow(DailyResponse.DailyBean data) {

liWindow = new LiWindow(context);

final View view = LayoutInflater.from(context).inflate(R.layout.window_forecast_detail, null);

TextView tv_datetime = view.findViewById(R.id.tv_datetime);

TextView tv_tmp_max = view.findViewById(R.id.tv_tmp_max);//最高温

TextView tv_tmp_min = view.findViewById(R.id.tv_tmp_min);//最低温

TextView tv_uv_index = view.findViewById(R.id.tv_uv_index);//紫外线强度

TextView tv_cond_txt_d = view.findViewById(R.id.tv_cond_txt_d);//白天天气状态

TextView tv_cond_txt_n = view.findViewById(R.id.tv_cond_txt_n);//晚上天气状态

TextView tv_wind_deg = view.findViewById(R.id.tv_wind_deg);//风向360角度

TextView tv_wind_dir = view.findViewById(R.id.tv_wind_dir);//风向

TextView tv_wind_sc = view.findViewById(R.id.tv_wind_sc);//风力

TextView tv_wind_spd = view.findViewById(R.id.tv_wind_spd);//风速

TextView tv_cloud = view.findViewById(R.id.tv_cloud);//云量 V7 新增

TextView tv_hum = view.findViewById(R.id.tv_hum);//相对湿度

TextView tv_pres = view.findViewById(R.id.tv_pres);//大气压强

TextView tv_pcpn = view.findViewById(R.id.tv_pcpn);//降水量

// TextView tv_pop = view.findViewById(R.id.tv_pop);//降水概率 V7 删除

TextView tv_vis = view.findViewById(R.id.tv_vis);//能见度

tv_datetime.setText(data.getFxDate() + " " + DateUtils.Week(data.getFxDate()));//时间日期

tv_tmp_max.setText(data.getTempMax() + “℃”);

tv_tmp_min.setText(data.getTempMin() + “℃”);

tv_uv_index.setText(data.getUvIndex());

tv_cond_txt_d.setText(data.getTextDay());

tv_cond_txt_n.setText(data.getTextNight());

tv_wind_deg.setText(data.getWind360Day() + “°”);

tv_wind_dir.setText(data.getWindDirDay());

tv_wind_sc.setText(data.getWindScaleDay() + “级”);

tv_wind_spd.setText(data.getWindSpeedDay() + “公里/小时”);

tv_cloud.setText(data.getCloud() + “%”);//V7 版本中,新增 云量

tv_hum.setText(data.getHumidity() + “%”);

tv_pres.setText(data.getPressure() + “hPa”);

tv_pcpn.setText(data.getPrecip() + “mm”);

// tv_pop.setText(data.getPop() + “%”);//V7 版本中,天气预报中没有降水概率这个值

tv_vis.setText(data.getVis() + “km”);

liWindow.showCenterPopupWindow(view, SizeUtils.dp2px(context, 300), SizeUtils.dp2px(context, 500), true);

}

再看showHourlyWindow

//显示小时详情天气信息弹窗

@RequiresApi(api = Build.VERSION_CODES.O)

private void showHourlyWindow(HourlyResponse.HourlyBean data) {

liWindow = new LiWindow(context);

final View view = LayoutInflater.from(context).inflate(R.layout.window_hourly_detail, null);

TextView tv_time = view.findViewById(R.id.tv_time);//时间

TextView tv_tem = view.findViewById(R.id.tv_tem);//温度

TextView tv_cond_txt = view.findViewById(R.id.tv_cond_txt);//天气状态描述

TextView tv_wind_deg = view.findViewById(R.id.tv_wind_deg);//风向360角度

TextView tv_wind_dir = view.findViewById(R.id.tv_wind_dir);//风向

TextView tv_wind_sc = view.findViewById(R.id.tv_wind_sc);//风力

TextView tv_wind_spd = view.findViewById(R.id.tv_wind_spd);//风速

TextView tv_hum = view.findViewById(R.id.tv_hum);//相对湿度

TextView tv_pres = view.findViewById(R.id.tv_pres);//大气压强

TextView tv_pop = view.findViewById(R.id.tv_pop);//降水概率

TextView tv_dew = view.findViewById(R.id.tv_dew);//露点温度

TextView tv_cloud = view.findViewById(R.id.tv_cloud);//云量

String time = DateUtils.updateTime(data.getFxTime());

tv_time.setText(WeatherUtil.showTimeInfo(time) + time);

tv_tem.setText(data.getTemp() + “℃”);

tv_cond_txt.setText(data.getText());

tv_wind_deg.setText(data.getWind360() + “°”);

tv_wind_dir.setText(data.getWindDir());

tv_wind_sc.setText(data.getWindScale() + “级”);

tv_wind_spd.setText(data.getWindSpeed() + “公里/小时”);

tv_hum.setText(data.getHumidity() + “%”);

tv_pres.setText(data.getPressure() + “hPa”);

tv_pop.setText(data.getPop() + “%”);

tv_dew.setText(data.getDew() + “℃”);

tv_cloud.setText(data.getCloud() + “%”);

liWindow.showCenterPopupWindow(view, SizeUtils.dp2px(context, 300), SizeUtils.dp2px(context, 400), true);

}

里面只有些许值和你之前的不一样,你直接替换就可以了。

然后再来看这个getDailyResult方法返回

/**

  • 天气预报数据返回 V7

  • @param response

*/

@Override

public void getDailyResult(Response response) {

if (response.body().getCode().equals(Constant.SUCCESS_CODE)) {

List<DailyResponse.DailyBean> data = response.body().getDaily();

if (data != null && data.size() > 0) {//判空处理

tvLowHeight.setText(data.get(0).getTempMin() + " / " + data.get(0).getTempMax() + “℃”);

dailyListV7.clear();//添加数据之前先清除

dailyListV7.addAll(data);//添加数据

mAdapterDailyV7.notifyDataSetChanged();//刷新列表

} else {

ToastUtils.showShortToast(context, “天气预报数据为空”);

}

} else {//异常状态码返回

ToastUtils.showShortToast(context, CodeToStringUtils.WeatherCode(response.body().getCode()));

}

}

列表赋值,然后刷新适配器进行数据渲染。

再看getHourlyResult方法返回

/**

  • 逐小时天气数据返回 V7

  • @param response

*/

@Override

public void getHourlyResult(Response response) {

if(response.body().getCode().equals(Constant.SUCCESS_CODE)){

List<HourlyResponse.HourlyBean> data = response.body().getHourly();

if(data != null && data.size()> 0){

hourlyListV7.clear();

hourlyListV7.addAll(data);

mAdapterHourlyV7.notifyDataSetChanged();

}else {

ToastUtils.showShortToast(context, “逐小时预报数据为空”);

}

}else {

ToastUtils.showShortToast(context, CodeToStringUtils.WeatherCode(response.body().getCode()));

}

}

内容差不多的,只不过数据不同

接下来就是空气质量和生活数据返回的处理了

先看getAirNowResult方法返回

/**

  • 空气质量返回 V7

  • @param response

*/

@Override

public void getAirNowResult(Response response) {

if(response.body().getCode().equals(Constant.SUCCESS_CODE)){

AirNowResponse.NowBean data = response.body().getNow();

if(response.body().getNow() !=null){

rpbAqi.setMaxProgress(300);//最大进度,用于计算

rpbAqi.setMinText(“0”);//设置显示最小值

rpbAqi.setMinTextSize(32f);

rpbAqi.setMaxText(“300”);//设置显示最大值

rpbAqi.setMaxTextSize(32f);

rpbAqi.setProgress(Float.valueOf(data.getAqi()));//当前进度

rpbAqi.setArcBgColor(getResources().getColor(R.color.arc_bg_color));//圆弧的颜色

rpbAqi.setProgressColor(getResources().getColor(R.color.arc_progress_color));//进度圆弧的颜色

rpbAqi.setFirstText(data.getCategory());//空气质量描述 取值范围:优,良,轻度污染,中度污染,重度污染,严重污染

rpbAqi.setFirstTextSize(44f);//第一行文本的字体大小

rpbAqi.setSecondText(data.getAqi());//空气质量值

rpbAqi.setSecondTextSize(64f);//第二行文本的字体大小

rpbAqi.setMinText(“0”);

rpbAqi.setMinTextColor(getResources().getColor(R.color.arc_progress_color));

tvPm10.setText(data.getPm10());//PM10

tvPm25.setText(data.getPm2p5());//PM2.5

tvNo2.setText(data.getNo2());//二氧化氮

tvSo2.setText(data.getSo2());//二氧化硫

tvO3.setText(data.getO3());//臭氧

tvCo.setText(data.getCo());//一氧化碳

}else {

ToastUtils.showShortToast(context,“空气质量数据为空”);

}

}else {

ToastUtils.showShortToast(context, CodeToStringUtils.WeatherCode(response.body().getCode()));

}

}

最大值从500变为300了。

生活数据getLifestyleResult方法返回

/**

  • 生活数据返回 V7

  • @param response

*/

@Override

public void getLifestyleResult(Response response) {

if(response.body().getCode().equals(Constant.SUCCESS_CODE)){

List<LifestyleResponse.DailyBean> data = response.body().getDaily();

for (int i = 0; i < data.size(); i++) {

switch (data.get(i).getType()) {

case “5”:

tvUv.setText(“紫外线:” + data.get(i).getText());

break;

case “8”:

tvComf.setText(“舒适度:” + data.get(i).getText());

break;

case “3”:

tvDrsg.setText(“穿衣指数:” + data.get(i).getText());

break;

case “9”:

tvFlu.setText(“感冒指数:” + data.get(i).getText());

break;

case “1”:

tvSport.setText(“运动指数:” + data.get(i).getText());

break;

case “6”:

tvTrav.setText(“旅游指数:” + data.get(i).getText());

break;

case “2”:

tvCw.setText(“洗车指数:” + data.get(i).getText());

break;

case “10”:

tvAir.setText(“空气指数:” + data.get(i).getText());

break;

}

}

}else {

ToastUtils.showShortToast(context, CodeToStringUtils.WeatherCode(response.body().getCode()));

}

}

注意里面的变化,现在是根据Type的值获取对应的详细数据了。

现在对这个返回的数据做了处理,下面就是要在相应的地方添加请求了,不请求就肯定没有数据返回的。

第一个地方有两处改动,定位之后和下拉刷新的时候

在这里插入图片描述

第二个地方是切换城市之后

在这里插入图片描述

第三个是在onResume

在这里插入图片描述

第四个是在接收都相应的事件之后

在这里插入图片描述

MainActiivty的改动已经完成了,接下来改动SearchCityActivity

2. 修改SearchCityActivity

先修改SearchCityAdapter,因为数据源变了

package com.llw.goodweather.adapter;

import androidx.annotation.Nullable;
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

尾声

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

最后想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。

进阶学习视频

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

0; i < data.size(); i++) {

switch (data.get(i).getType()) {

case “5”:

tvUv.setText(“紫外线:” + data.get(i).getText());

break;

case “8”:

tvComf.setText(“舒适度:” + data.get(i).getText());

break;

case “3”:

tvDrsg.setText(“穿衣指数:” + data.get(i).getText());

break;

case “9”:

tvFlu.setText(“感冒指数:” + data.get(i).getText());

break;

case “1”:

tvSport.setText(“运动指数:” + data.get(i).getText());

break;

case “6”:

tvTrav.setText(“旅游指数:” + data.get(i).getText());

break;

case “2”:

tvCw.setText(“洗车指数:” + data.get(i).getText());

break;

case “10”:

tvAir.setText(“空气指数:” + data.get(i).getText());

break;

}

}

}else {

ToastUtils.showShortToast(context, CodeToStringUtils.WeatherCode(response.body().getCode()));

}

}

注意里面的变化,现在是根据Type的值获取对应的详细数据了。

现在对这个返回的数据做了处理,下面就是要在相应的地方添加请求了,不请求就肯定没有数据返回的。

第一个地方有两处改动,定位之后和下拉刷新的时候

在这里插入图片描述

第二个地方是切换城市之后

在这里插入图片描述

第三个是在onResume

在这里插入图片描述

第四个是在接收都相应的事件之后

在这里插入图片描述

MainActiivty的改动已经完成了,接下来改动SearchCityActivity

2. 修改SearchCityActivity

先修改SearchCityAdapter,因为数据源变了

package com.llw.goodweather.adapter;

import androidx.annotation.Nullable;
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-CG0weBAy-1712154915906)]

[外链图片转存中…(img-vl7qoNSB-1712154915907)]

[外链图片转存中…(img-Lx04Ixha-1712154915907)]

[外链图片转存中…(img-ReV6Mepi-1712154915907)]

[外链图片转存中…(img-gWnhzJ32-1712154915908)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

尾声

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

最后想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。
[外链图片转存中…(img-bQYD4iT0-1712154915908)]
当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。

进阶学习视频

[外链图片转存中…(img-Gt4BjHYV-1712154915909)]

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-Ln6vLqxi-1712154915909)]

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
  • 27
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android漫画app源码指的是一个可以阅读漫画和漫画书的Android应用程序的源代码。这个应用程序可以使用户在手机和平板电脑上方便地阅读各种漫画和漫画书,可视化阅读体验佳。使用者可以通过app进行虚拟购买、订阅、收藏,还可以对阅读过程进行个性化设置、评论和分享,提用户的参与体验。 在开发这个应用程序时,需要依靠Android开发平台,并使用Java语言等相关技术。一般需要考虑到应用程序的用户体验、数据安全、流畅性等问题。在源码中,开发者将包含必要的组件和库来实现这些功能。如果需要进行代码的修改和扩展,开发者需要对应用程序的架构和代码的实现细节有深入了解。 总之,Android漫画app源码的开发需要有经验丰富的开发者,理解漫画市场以及用户习惯,能够优化用户体验,并且具有对漫画阅读技术的深入理解。同时,源码的开发需要对技术细节有精确掌握,能够速定位和解决程序中的问题。这样,才能够开发出流畅、安全和易用的漫画app。 ### 回答2: Android漫画App源码是用于构建Android平台上的漫画阅读应用程序的代码。它包含了漫画App的主要功能和界面设计,可以让用户浏览、搜索、阅读和收藏各种漫画作品。 通常,漫画App源码会包括以下几个主要模块: 1. 用户界面:包括主屏幕、漫画列表、漫画详情、搜索框等常见界面元素,通过这些界面用户可以浏览、查找和打开漫画。 2. 数据管理:包括获取漫画信息、漫画列表、保存用户书签等功能。它会与漫画网站的API进行交互,请求数据并将其展示在用户界面上。 3. 阅读器:用于解析和展示漫画页面的工具。它会根据用户在漫画App界面上的操作,加载并显示相应的漫画画面。 4. 用户管理:包括用户注册、登录、个人资料等功能。用户可以通过注册登录来同步他们的阅读进度、收藏等数据。 5. 设置选项:让用户自定义应用程序的参数,例如屏幕亮度、字体大小、阅读模式等。 对于一个漫画App源码,开发者可以根据自己的需求进行相应的定制和修改。他们可以添加的功能、优化性能、改进界面等。此外,他们还可以进行UI主题定制,使App具有好的用户体验。 总的来说,Android漫画App源码提供了一套基本的功能和界面设计,省去了开发者从零开始的工作。通过修改和优化源码,开发者可以速构建自己的漫画App,并在Android平台上为用户提供完整的漫画阅读体验。 ### 回答3: Android漫画App源码是一个用于开发漫画阅读应用的代码库,可用于创建类似于在线漫画阅读平台的应用程序。 这个源码通常包含了一些基本的功能和特性,例如漫画的分类浏览、搜索、收藏、观看历史记录和评论等功能。它还可能包含一些级特性,如离线下载、推荐系统和用户个性化设置等。 在开发Android漫画App时,开发者可以使用这个源码作为基础框架,根据自己的需求和想法进行二次开发和定制。他们可以根据自己的喜好选择合适的设计风格和布局来创建应用程序界面,并可以使用源码中提供的API来获取漫画数据并展示给用户。 为了完善这个源码,开发者可能需要对用户界面进行优化,提其易用性和吸引力。他们还可以添加一些额外的功能和扩展,如利用社交媒体集成实现用户之间的互动,或者使用广告集成来获得收入。 通过使用这个源码,开发者可以省去一些重复的工作,速搭建一个功能相对完整的漫画阅读应用程序。然后,他们可以根据自己的业务需求进行进一步的开发和改进,以提供好的用户体验和增加应用价值。 尽管源码可以给开发者提供一个好的起点,但在实际应用中,他们还需要根据自己的实际情况对代码进行适当的修改和调整。这样才能实现一个独特且符合用户需求的漫画阅读应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值