Java 在服务方法中设置对象变量

Java 在服务方法中设置对象变量,java,variables,rx-java,Java,Variables,Rx Java,我有两个域对象、消息和联系人: public class Contact { String name; } public class Message { String body; Contact contact; } 我正在填充消息的列表,并将它们显示给用户。异步检索每个消息的联系人信息,然后更新列表。我基本上就是这样设置的: listAdapter.setDataSet(listOfMessages); for (Message message : listOfM

我有两个域对象、消息和联系人:

public class Contact {
    String name;
}

public class Message {
    String body;
    Contact contact;
}
我正在填充
消息的列表
,并将它们显示给用户。异步检索每个消息的联系人信息,然后更新列表。我基本上就是这样设置的:

listAdapter.setDataSet(listOfMessages);

for (Message message : listOfMessages) {
    fetchContactDetails(message);
}

...

fetchContactDetails(Message message) {
    contactService
        .fetchContactDetails(listOfMessages)
        .subscribeOn... // observe, etc
        .observe(new Observable<Contact>() {
            onNext(Contact contact) {
                message.setContact(contact);
                list.notifyChanged(message);
            }
        });
listAdapter.setDataSet(listOfMessages);
for(消息:listOfMessages){
获取联系人详细信息(消息);
}
...
fetchContactDetails(消息){
联系服务
.fetchContactDetails(listOfMessages)
.subscribeOn…//观察等
.观察(新的可观察的){
onNext(联系人){
message.setContact(contact);
列表。通知已更改(消息);
}
});
这感觉像是很多代码,因为我可以只更新服务功能
contactService.fetchContactDetails
中的每个
消息
联系人
。相反,使用服务方法修改传入的对象而不返回任何内容会让人觉得不干净

使用服务函数更新作为参数传入的对象而不返回任何内容,这是一种不好的做法吗

使用服务函数更新作为参数传入的对象而不返回任何内容,这是一种不好的做法吗

不,您可以通过使用
Completable
来实现
void
方法
Observable
,但是在您的情况下,您仍然需要更新主线程上的UI,因此您将在主线程上订阅并处理
onNext
(通过添加
observeOn(AndroidSchedulers.mainThread())

因此,在本例中,您的方法似乎不是纯
void
方法,它不返回任何内容,而是更新一些数据并将其返回到UI进行处理的方法

因此,我认为这是一个更一般的架构问题,即如何正确地分离代码。我将大胆地将模型/域逻辑收集在单独的
可观察的
,并让UI/表示处理UI更新

顺便说一句,使用
from()
flatMap()


然后,您可以控制enitre进程,比如在所有更新完成后执行某些操作,或者限制并行性或其他任何操作。

我要添加的唯一一点是,在所有消息都有联系人之后,您应该调用notifyChanged一次;这将加快UI的速度,因为它只需要更新一次。它是什么。obesrve()?新的可观察的?我希望订阅
Observable.from(listOfMessages)
   .flatMap(msg -> contactService.fetchContactDetails(msg))