我有这样的模型(我无法改变)
public class Container {
private int id
private List<Item> items
}
项目类如下所示:
public class Item {
private int something;
private Owner owner;
}
所有者类看起来像这样:
public class Owner {
private String login;
private String url;
private String name;
}
问题是一个请求(不是我的,无法更改)获取一个包含所有项目的Container,而其所有者只获取login和url属性(在此示例中)。此调用不会检索name属性。
我必须使用login参数发出另一个请求以获取所有者的名称。并更新我的模型以填充此属性,以便稍后我可以使用项目列表(使用所有者名称)。
我是改装的新人,不知道rxJava,但我环顾四周,无法想出这个。
这是我到目前为止所做的:
界面
public interface SomeService {
@GET("somerlToGetContainerWithItems")
Observable<Container> getContainer();
@GET("url/{login}")
Observable<Owner> getOwner(@Path("login") String login);
}
api客户端
public static Retrofit getClient() {
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
}
关于主要活动,我有这个代码;
service = client.getClient().create(Service.class);
private Observable<Container> getContainer() {
return service.getContainer();
}
private Observable<Owner> getOwner(Item item) {
return service.getOwner(item.getOwner().getLogin());
}
getContainer()
.flatMap(r-> Observable.just(r.getItems()))
.flatMap(new Func1<Item, Observable<? extends Owner>>() {
@Override
public Observable<? extends Owner> call(Item response) {
return getOwner(response);
}
}, new Func2<List<Item>, Owner, List<Item>>() {
@Override
public List<Item> call(List<Item> items, Owner owner) {
// dont know how to return the list of items again
// with the owner name
}
});
所以基本上我必须根据每个项目发出第二个请求,然后返回这个项目列表,但是使用所有者名称。
答案 0 :(得分:0)
[KOTLIN] 对于未来的人:)
class PanelActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_instructor_panel)
val token = intent.extras?.getString(TOKEN)
val bearerToken = "Bearer $token"
val sharedPreferences = getSharedPreferences(ID, Context.MODE_PRIVATE)
// here I use my second request
postItem(token, bearerToken, sharedPreferences)
}
fun postItem(token: String?, bearerToken: String, sharedPreferences: SharedPreferences) {
val id= getID(token)
RetrofitClient.sendNetworkRequest.getId(id.toString(), bearerToken).enqueue(object : Callback<Your_Object> {
override fun onResponse(
call: Call<Your_Object>,
response: Response<Your_Object>) {
if (response.isSuccessful) {
preparePost(token, bearerToken, sharedPreferences)
}
override fun onFailure(call: Call<Your_Object>, t: Throwable) {
// on failure
}
})
}
fun preparePost(token: String?, bearerToken: String, sharedPreferences: SharedPreferences){
RetrofitClient.sendNetworkRequest.getAllRides(id, bearerToken).enqueue(object : Callback<Your_Object> {
override fun onResponse(call: Call<Your_Object>, response:Response<Your_Object>) {
if (response.isSuccessful) {
// on response if successful
}
}
}
}
override fun onFailure(call: Call<Your_Object>, t: Throwable) {
// on failure
}
})
}
如您所见,我需要发布请求,将一些ID放入sharedPreferences,然后将保存的值用于新请求中。 只需执行其他功能,然后在Response上调用第一个请求即可。