您的位置:首页 > 编程语言 > Java开发

RxJava + Retrofit 结合使用

2017-07-26 16:29 274 查看

关于Retrofit使用Json数据的一个坑

一般在根据Json数据设计JavaBean的时候我们Android一般使用的GsonFormat这个插件工具,这个工具很方便,但是也有要注意的地方。今天在调试一个天气接口的时候因为没有复制该复制的内容,导致数据一直无法解析。接下来就贴出具体内容。

这是Json数据格式



应该全部复制到GsonFormat,不能把最外层的大括号漏掉。

正确的JavaBean内容

package com.example.rxandroidtest.entity;

import java.util.List;

/**
* Created by D'Russel on 2017/7/26.
*/

public class Weather {

private List<HeWeather5Bean> HeWeather5;

public List<HeWeather5Bean> getHeWeather5() {
return HeWeather5;
}

public void setHeWeather5(List<HeWeather5Bean> HeWeather5) {
this.HeWeather5 = HeWeather5;
}
.............   //其他内容就不贴了,篇幅有限

}


错误的JavaBean内容

package com.example.rxandroidtest.entity;

/**
* Created by  D'Russel on 2017/7/26.
*/

public class HeWeather5 {

private BasicBean basic;
private NowBean now;
private String status;

public BasicBean getBasic() {
return basic;
}

public void setBasic(BasicBean basic) {
this.basic = basic;
}

public NowBean getNow() {
return now;
}

public void setNow(NowBean now) {
this.now = now;
}

public String getStatus() {
return status;
}

public void setStatus(String status) {
this.status = status;
}
.............   //其他内容就不贴了,篇幅有限
}


上面两个对比一下,我们会发现,第二个的JavaBean实际上就是第一个JavaBean的内容,从第一个JavaBean中的

private List<HeWeather5Bean> HeWeather5;


可以看出来,这个可能会有多个HeWeather5值,所以第二种方式导致数据无法解析。

接下来来实现一下RxJava + Retrofit的结合使用

RxJava + Retrofit

build.gradle的内容

添加依赖

compile "io.reactivex.rxjava2:rxjava:2.1.1"
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'


具体实现

和 Retrofit 的实现步骤差不多,咱们使用的接口是和风天气的接口

咱们先自定义一个网络服务,代码如下:

public interface NetWorkService {

//实况天气,传两个参数,一个是城市名,一个是从和风天气申请的key
@GET("now")
Observable<Weather> getCity(@Query("city") String city,
@Query("key") String key);

}


初始化网络请求

Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://free-api.heweather.com/v5/")   //这是和风天气的URL
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();


获取访问的上海的城市id

NetWorkService netWorkService = retrofit.create(NetWorkService.class);
Observable<Weather> observable = netWorkService.getCity("上海",key);
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Weather>() {
@Override
public void accept(@NonNull Weather weather) throws Exception {
System.out.println(weather);
System.out.println(weather.getHeWeather5().get(0).getBasic().getId());
}
});


结果如下:



这里的“”CN101020100“”就是和风天气对于的上海市的id

这样一个采用RxJava的Retrofit网络请求就实现了。

通过这个例子可以看出这种方式是非常的方便的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: