我从服务器获取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
没有任何反应。问题:如何解决此问题,以及通常如何正确解决此类问题?
最佳答案
向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));
这样,您就不会沉迷于细节,并且可以调整您对反应模型的理解。