RxJava + Retrofit 结合使用

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

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

这是Json数据格式
RxJava + Retrofit 结合使用_第1张图片
应该全部复制到GsonFormat,不能把最外层的大括号漏掉。

正确的JavaBean内容

package com.example.rxandroidtest.entity;

import java.util.List;

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

public class Weather {

    private List HeWeather5;     

    public List getHeWeather5() {
        return HeWeather5;
    }

    public void setHeWeather5(List 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 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 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 observable = netWorkService.getCity("上海",key);
              observable.subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(new Consumer() {
                            @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网络请求就实现了。
通过这个例子可以看出这种方式是非常的方便的。

你可能感兴趣的:(android)