Android Api调用列表中的项目

时间:2016-10-26 22:54:18

标签: android api retrofit rx-java

我正在尝试调用列表中的每个项目,为列表中的每个项目添加一些额外的数据。我正在使用改造+ RxJava。

我需要获取用户列表,为每个用户拨打电话,并通过他的adreess邮政编码获取城市。

我是如何尝试的。

public void getUsers() {
    Observable<List<User>> userObservable = mService.getUsers()
            .flatMapIterable(new Func1<List<User>, Iterable<User>>() {
                @Override
                public Iterable<User> call(List<User> user) {
                    return users;
                }
            })
            .flatMap(new Func1<User, Observable<City>>() {
                @Override
                public Observable<City> call(User user) {
                    return mService.getCity(user.getAdress.getPostal_code);
                }
            })
            .map(new Func1<User, City>() {
                @Override
                public City call(User user) {
                    return user.getAdress().getCity().getName();
                }
            })

服务:

@GET("/somelink/users")
Observable<List<User>> getUsers();

@GET("/somelink/users/{code}")
Observable<City> getCity(@Path("code") String postalCode);



public class User {

    @SerializedName("id")
    @Expose
    private Integer id;

    @SerializedName("name")
    @Expose
    private String name;

    @SerializedName("adress")
    @Expose
    private Adress adress;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.named = name;
    }

    public Adress getAdress() {
        return adress;
    }

    public void setAdress(Adress adress) {
        this.adress = adress;
    }

}



public class Adress {

    privare City;

    @SerializedName("postal_code")
    @Expose
    private String postal_code;

    @SerializedName("street")
    @Expose
    private String street;

    public String getPostal_code() {
        return postal_code;
    }

    public void setPostal_code(String postal_code) {
        this.postal_code = postal_code;
    }

    public Adress getStreet() {
        return adress;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    public City getCity() {
        return city;
    }

    public void setCity(City city) {
        this.city = city;
    }

}


public class City {

    @SerializedName("name")
    @Expose
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

getUsers()返回

[
  {
    "id": 1
    "name": "John Doe",
    "adress": {
      "postal_code": "somecode",
      "street": "some Street ..."
    }
  },
  {
  "id": 2
  "name": "Adam Smith",
  "adress": {
    "postal_code": "somecode",
    "street": "some other Street ..."
  }
]

在map函数中我得到了错误&#34;没有类型变量的实例存在,因此City符合User&#34;。我认为错误在模型中,但不知道如何使它们正确。我是Rxjava的新手,在这里遇到问题。

1 个答案:

答案 0 :(得分:1)

此操作正在返回尝试将User转移到Observable<City>

.flatMap(new Func1<User, Observable<City>>() {
    @Override
    public Observable<City> call(User user) {
        return mService.getCity(user.getAdress.getPostal_code());
    }
})

然后,在这里,您从上一个操作返回了Observable<City>,但是您为此地图添加了User,并尝试转换为City

你告诉RxJava你想要归还一些City,而不是String

.map(new Func1<User, City>() {
    @Override
    public City call(User user) {
        return user.getAdress().getCity().getName();
    }
})

user.getAdress().getCity().getName();会返回String

public class City {

    @SerializedName("name")
    @Expose
    private String name;

    public String getName() {
        return name;
    }

所以,我认为你的意思是.map(new Func1<City, String>() {,虽然我也认为你应该订阅Observable<City>而不是映射它。然后,如果您遵循RxJava的订阅模型,那么您可能只是return mService.getUsers().flatMapIterable(...来自该方法并且不进行最终的地图操作。