Android 天气APP(三)访问天气API与数据请求

public String getLocation() {

return location;

}

public void setLocation(String location) {

this.location = location;

}

public String getParent_city() {

return parent_city;

}

public void setParent_city(String parent_city) {

this.parent_city = parent_city;

}

public String getAdmin_area() {

return admin_area;

}

public void setAdmin_area(String admin_area) {

this.admin_area = admin_area;

}

public String getCnty() {

return cnty;

}

public void setCnty(String cnty) {

this.cnty = cnty;

}

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 getTz() {

return tz;

}

public void setTz(String tz) {

this.tz = tz;

}

}

public static class UpdateBean {

/**

  • loc : 2020-04-01 15:45

  • utc : 2020-04-01 07:45

*/

private String loc;

private String utc;

public String getLoc() {

return loc;

}

public void setLoc(String loc) {

this.loc = loc;

}

public String getUtc() {

return utc;

}

public void setUtc(String utc) {

this.utc = utc;

}

}

public static class NowBean {

/**

  • cloud : 100

  • cond_code : 104

  • cond_txt : 阴

  • fl : 18

  • hum : 82

  • pcpn : 0.0

  • pres : 1006

  • tmp : 18

  • vis : 16

  • wind_deg : 79

  • wind_dir : 东北风

  • wind_sc : 2

  • wind_spd : 9

*/

private String cloud;

private String cond_code;

private String cond_txt;

private String fl;

private String hum;

private String pcpn;

private String pres;

private String tmp;

private String vis;

private String wind_deg;

private String wind_dir;

private String wind_sc;

private String wind_spd;

public String getCloud() {

return cloud;

}

public void setCloud(String cloud) {

this.cloud = cloud;

}

public String getCond_code() {

return cond_code;

}

public void setCond_code(String cond_code) {

this.cond_code = cond_code;

}

public String getCond_txt() {

return cond_txt;

}

public void setCond_txt(String cond_txt) {

this.cond_txt = cond_txt;

}

public String getFl() {

return fl;

}

public void setFl(String fl) {

this.fl = fl;

}

public String getHum() {

return hum;

}

public void setHum(String hum) {

this.hum = hum;

}

public String getPcpn() {

return pcpn;

}

public void setPcpn(String pcpn) {

this.pcpn = pcpn;

}

public String getPres() {

return pres;

}

public void setPres(String pres) {

this.pres = pres;

}

public String getTmp() {

return tmp;

}

public void setTmp(String tmp) {

this.tmp = tmp;

}

public String getVis() {

return vis;

}

public void setVis(String vis) {

this.vis = vis;

}

public String getWind_deg() {

return wind_deg;

}

public void setWind_deg(String wind_deg) {

this.wind_deg = wind_deg;

}

public String getWind_dir() {

return wind_dir;

}

public void setWind_dir(String wind_dir) {

this.wind_dir = wind_dir;

}

public String getWind_sc() {

return wind_sc;

}

public void setWind_sc(String wind_sc) {

this.wind_sc = wind_sc;

}

public String getWind_spd() {

return wind_spd;

}

public void setWind_spd(String wind_spd) {

this.wind_spd = wind_spd;

}

}

}

}

这样就不用在一个个的去写Get和Set方法了,都给你生成好了。一步到位,用了之后根本停不下来。

3. 网络请求


通过上面的访问地址,我们可以看得出来,只要修改location的值就可以得到不同地方的天气数据信息了,刚才是在网页上访问的,接下来就通过Android来访问这个地址,得到数据并且显示出来。

说到网络请求,就不得不提一下OKHttp网络请求框架,刚开始你可能比较陌生,这里做一下简单的讲解。

① OKHttp

OkHttp是一个第三方类库,用于android中请求网络。这是一个开源项目,是安卓端最火热的轻量级框架。

网络请求分两种方式Post请求和Get请求

1.Post和Get的区别
  • 浏览器对URL的长度有限制,所以GET请求不能代替POST请求发送大量数据

  • GET请求发送数据更小

  • POST请求不能被缓存

  • POST请求相对GET请求是「安全」的

  • POST请求Request Body传递参数

以上皆是个人理解,如有不对,望斧正。

2.同步和异步的区别
  • 同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。

  • 异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。

以上皆是个人理解,如有不对,望斧正。

3.Get的同步请求

对于同步请求在请求时需要开启子线程,请求成功后需要跳转到UI线程修改UI,示例代码如下:

public void getDataSync() {

//创建新的线程

new Thread(new Runnable() {

@Override

public void run() {

try {

OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象

Request request = new Request.Builder()

.url(“http://www.baidu.com”)//请求接口。如果需要传参拼接到接口后面。

.build();//创建Request 对象

Response response = null;

response = client.newCall(request).execute();//得到Response 对象

if (response.isSuccessful()) {

Log.d(“kwwl”, “response.code()==” + response.code());

Log.d(“kwwl”, “response.message()==” + response.message());

Log.d(“kwwl”, “res==” + response.body().string());

//此时的代码执行在子线程,修改UI的操作请使用handler跳转到UI线程。

}

} catch (Exception e) {

e.printStackTrace();

}

}

}).start();

}

注意事项:

1,Response.code是http响应行中的code,如果访问成功则返回200.这个不是服务器设置的,而是http协议中自带的。res中的code才是服务器设置的。注意二者的区别。

2,response.body().string()本质是输入流的读操作,所以它还是网络请求的一部分,所以这行代码必须放在子线程。

3,response.body().string()只能调用一次,在第一次时有返回值,第二次再调用时将会返回null。原因是:response.body().string()的本质是输入流的读操作,必须有服务器的输出流的写操作时客户端的读操作才能得到数据。而服务器的写操作只执行一次,所以客户端的读操作也只能执行一次,第二次将返回null。

4.Get的异步请求

这种方式不用再次开启子线程,但回调方法是执行在子线程中,所以在更新UI时还要跳转到UI线程中。

private void getDataAsync() {

//创建OkHttpClient对象

OkHttpClient client = new OkHttpClient();

//创建Request 对象

Request request = new Request.Builder()

.url(“http://www.baidu.com”)

.build();

client.newCall(request).enqueue(new Callback() {

@Override

public void onFailure(Call call, IOException e) {

}

@Override

public void onResponse(Call call, Response response) throws IOException {

if (response.isSuccessful()) {//回调的方法执行在子线程。

Log.d(“kwwl”, “获取数据成功了”);

Log.d(“kwwl”, “response.code()==” + response.code());

Log.d(“kwwl”, “response.body().string()==” + response.body().string());

}

}

});

}

注意事项:

1,回调接口的onFailure方法和onResponse执行在子线程。

2,response.body().string()方法也必须放在子线程中。当执行这行代码得到结果后,再跳转到UI线程修改UI。

5.Post的同步请求

示例代码

public void postDataWithParame() {

//创建新的线程

new Thread(new Runnable() {

@Override

public void run() {

try {

OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。

FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体

formBody.add(“username”,“zhangsan”);//传递键值对参数

Request request = new Request.Builder()//创建Request 对象。

.url(“http://www.baidu.com”)

.post(formBody.build())//传递请求体

.build();

client.newCall(request).execute();//得到Response 对象

if (response.isSuccessful()) {

Log.d(“kwwl”, “response.code()==” + response.code());

Log.d(“kwwl”, “response.message()==” + response.message());

Log.d(“kwwl”, “res==” + response.body().string());

//此时的代码执行在子线程,修改UI的操作请使用handler跳转到UI线程。

}

最后

一线互联网Android面试题含详解(初级到高级专题)

这些题目是今年群友去腾讯、百度、小米、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。并且大多数都整理了答案,熟悉这些知识点会大大增加通过前两轮技术面试的几率

如果设置门槛,很多开发者朋友会因此错过这套高级架构资料,错过提升成为架构师的可能。这就失去了我们的初衷;让更多人都能通过高效高质量的学习,提升自己的技术和格局,升职加薪。

最后送给大家一句话,望共勉,永远不要放弃自己的梦想和追求;

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

Log.d(“kwwl”, “response.message()==” + response.message());

Log.d(“kwwl”, “res==” + response.body().string());

//此时的代码执行在子线程,修改UI的操作请使用handler跳转到UI线程。

}

最后

一线互联网Android面试题含详解(初级到高级专题)

这些题目是今年群友去腾讯、百度、小米、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。并且大多数都整理了答案,熟悉这些知识点会大大增加通过前两轮技术面试的几率

[外链图片转存中…(img-SmY373lx-1714310183680)]

如果设置门槛,很多开发者朋友会因此错过这套高级架构资料,错过提升成为架构师的可能。这就失去了我们的初衷;让更多人都能通过高效高质量的学习,提升自己的技术和格局,升职加薪。

最后送给大家一句话,望共勉,永远不要放弃自己的梦想和追求;

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 18
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值