如何在flatMap运算符中正确查询?

时间:2017-11-11 03:55:54

标签: java android rx-java rx-android

我从服务器获得json格式的聊天列表。我将他们推入班级ChatsModel。此类中有字段userId,即在每次聊天中都有该用户的userId。没有关于用户的其他信息。有一个字段可以获取有关类型UserMessagesResponse

的用户的信息

所以,在userMessagesResponse等于null

的开头

收到聊天列表和userId后,我必须发送另一个获取用户信息的请求。我是这样做的:

private void loadChatsFromNetwork(int count, AccessDataModel accessDataModel) {
String accessToken = accessDataModel.getAccessToken();

Flowable<ChatsModel> chatsModelSingle = getChatsApi().getChats(count, accessToken, Constants.api_version)
        .subscribeOn(Schedulers.io())
        .flatMap(chatsModel -> {
            RealmList<Item> items = chatsModel.getResponse().getItems();
            StringBuilder userIds = new StringBuilder();

            for (Item item : items) {
                userIds.append(item.getMessage().getUserId()).append(",");
            }

            return loadUsersById(userIds, chatsModel);
        })
        .observeOn(AndroidSchedulers.mainThread());

chatsModelSingle.subscribe(chatsModel -> {
            Log.d(TAG, chatsModel.getResponse().getItems().first().getMessage().getMessagesUserItem().getFirstName());
            chatsRepository.updateChatsData(chatsModel);
            iGetChatsCallback.onGetChatsSuccess(chatsModel);
        },
        throwable -> {
            iGetChatsCallback.onGetChatsError(throwable.getMessage());
            Log.d(TAG, "onError() " + throwable.getMessage());
        });
}

private ChatsModel loadUsersById(StringBuilder userIds, ChatsModel chatsModel) {

MyApplication.getChatsApi().getUsersByChats(userIds.toString(), "photo_100")
        .subscribe(messagesUser -> {

            RealmList<Item> item = chatsModel.getResponse().getItems();

            for (int i = 0; i < item.size(); i++) {
                Message message = item.get(i).getMessage();

                RealmList<UserMessagesResponse> messagesUserItemList = messagesUser.getUserMessagesResponse();
                for (UserMessagesResponse messagesResponse : messagesUserItemList) {
                    if (messagesResponse.getUid().equals(message.getUserId())) {
                        message.setMessagesUserItem(messagesResponse);
                        chatsModel.getResponse().getItems().get(i).setMessage(message);
                    }
                }
            }

        });

return chatsModel;
}

所有这些操作都发生在flatMap运算符的块中,因为我需要将收到的有关用户的信息推送到userMessagesResponse类的ChatsModel字段中。如果成功,我将chatsModel发送到适配器

这两个请求都是正确的。我正在获取userId列表和有关用户的信息。

问题是chatsModel在flatMap中返回return chatsModel后,没有任何进一步发生,subscriber没有任何反应。

问题:如何解决此问题以及如何正确解决此类问题?

1 个答案:

答案 0 :(得分:1)

flatMap()运算符传递一个返回Observable()的函数。在您的代码中,您将返回ChatsModel。返回Observable.just(loadUsersById(userIds, chatsModel))可能就足够了,因为这将是flatMap()期待的内容。

要在更一般的情况下解决此类问题,请从一个非常简单的问题模型开始:

Observable<Integer> chatHistory;
...
Observable<Long> getInfoAboutI(Integer i) {
  return Observable.just( 1L );
}
...
chatHistory
  .flatMap( i -> getInfoAboutI(i) )
  .subscribe( j -> logger.debug("j: " + j));

通过这种方式,您不会陷入细节之中,并且可以调整您对反应模型的理解。