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

时间:2017-03-07 18:41:35

标签: java variables rx-java

我有几个域对象,消息和联系人:

public class Contact {
    String name;
}

public class Message {
    String body;
    Contact contact;
}

我填充Message列表并向用户显示。以异步方式检索每个消息的联系信息,然后更新列表。这基本上就是我设置它的方式:

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);
            }
        });

这感觉就像很多代码,因为我可以只更新服务函数Message中的每个Contact contactService.fetchContactDetails。相反,使用服务方法修改传入的对象而不返回任何内容感觉不清楚。

使用服务函数更新作为参数传入的Object而不返回任何内容是不是很糟糕?

1 个答案:

答案 0 :(得分:0)

  

使用服务函数更新作为参数传入的Object而不返回任何内容是不是很糟糕?

不,您可以使用void实现Observable方法Completable,但在您的情况下,您仍需要更新主线程上的UI,因此您将订阅并处理mainThread上的onNext(通过添加observeOn(AndroidSchedulers.mainThread())) 因此,在这种情况下,您的方法似乎不是纯粹的void方法,它不返回任何内容,而是更新某些数据并将其返回到UI进行处理的方法。

所以,我认为这是一个更普遍的架构问题,关于如何正确分离代码。我会在单独的Observable中一起收集模型/域逻辑,让UI /表示只处理UI更新。

BTW,您可以使用from()flatMap()

更优雅地使用Rx循环播放
Observable.from(listOfMessages)
   .flatMap(msg -> contactService.fetchContactDetails(msg))

然后你可以控制enitre进程,比如在完成所有更新时做某事,或者限制并行性或其他什么。