java - Android、Retrofit、RxJava - 将多个实体的字段合并为一个实体

标签 java android retrofit rx-java2

请看下面我的代码。我从城市检索类别的代码:

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/

相关文章:

java - 使用 Gson Response.body() 进行改造不起作用

android - 改造和 orm 库抛出 StackOverflow

java - 从 servlet 尝试时,我没有看到创建的目录。这是为什么?

java - 将arraylist对象的某些参数显示到Android中的 ListView 中

java - 是否有编程方式或 eclipse 插件来计算 java 方法的大 O 符号

android - android 2.2 中的拖放布局

android - 使用 Retrofit 2.0 和 RxJava 获取响应状态码

java - android 如何解析数组项?

android - FLAG_KEEP_SCREEN_ON 仍然导致屏幕变暗

java - Android 上的 HtmlUnit : Dependencies