请看下面我的代码。我从城市检索类别的代码:
mcityAPI.authDevice(req)
.subscribeOn(Schedulers.io())
.flatMap(token -> mcityAPI.getCategories("/city/599/category",prepareHeaders(token)))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(categoryList->
{
HashMap<String, String> categoryNamesMap = new HashMap<>();
for (Category category : categoryList)
{
categoryNamesMap.put(category.getId(), category.getName());
}
}
, throwable ->
{
Throwable error = throwable;
String err = error.toString();
});
因此,第一个设备需要获得授权 - authDevice
。然后,需要提供token来调用getCategories
(实际上,应该先通过调用prepareHeaders
将token转换为header)
到目前为止,它有效。我能够成功加载类别。下一步是获取事件。在这种情况下,我应该调用 /city/599/event
,但我需要按如下方式执行:
- 再次提供 header (如何访问之前检索到的 token ?)
- 我的 Event 的 pojo 模型类包含一个名为
categoryName
的额外字段。每个返回的事件都将包含名为categoryId
的字段。我还添加了一个额外的字段categoryName
。对于每个返回的类别,我需要为categoryName
额外字段分配适当的值。类别名称应通过categoryId
从
categoryList
检索
是否有任何优雅的方式(一些 rxJava 运算符等)允许做我想做的事情?
最佳答案
据我了解,您的 token 是按设备分配的,因此您可以存储它以供以后使用。
首先:
- 获取您的 token 并将其存储在例如 SharedPreferences 中。这将使您可以从您需要的每个地方访问 token 。
其次:
现在您可以在同一个流中发出两个请求。
请记住正确使用
subscribeOn
。它仅适用于上游和下游的observeOn。这意味着您正在MainTread
上请求,因此您应该更改它。可以使用算子map来获取categoriesMap;
您应该注意错误处理,因为一次失败将取消订阅您的流,因此无法再次使用它。
triggerSubject
.flatMap(token -> mcityAPI.getCategories("/city/599/category",prepareHeaders(sharedPreferences.getToken())))
.map(categoryList -> {
final HashMap<String, String> categoryNamesMap = new HashMap<>();
for (Category category : categoryList)
{
categoryNamesMap.put(category.getId(), category.getName());
}
return categoryNamesMap;
})
.flatMap(cateogyrNameMap -> yourApiCall, prepareHeaders(sharedPreferences.getToken()))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.retry()
.subscribe(event -> {
// Do what you need
}
, throwable ->
{
Throwable error = throwable;
String err = error.toString();
});
关于java - Android、Retrofit、RxJava - 将多个实体的字段合并为一个实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44623351/