Android 使用RxJava从用户列表中提取用户名
我有下面的方法,其中我使用RxJava从Api获取一些数据,然后我操作这些数据以获得用户名列表和用户列表Android 使用RxJava从用户列表中提取用户名,android,rx-java,rx-java2,rx-android,Android,Rx Java,Rx Java2,Rx Android,我有下面的方法,其中我使用RxJava从Api获取一些数据,然后我操作这些数据以获得用户名列表和用户列表 public void getUsers(){ disposables = RxUtil.initDisposables(disposables); Disposable disposable = userApiRepository.getUsers() .subscribeOn(Schedulers.io()) .doOnNext(otherUsers -> {
public void getUsers(){
disposables = RxUtil.initDisposables(disposables);
Disposable disposable = userApiRepository.getUsers()
.subscribeOn(Schedulers.io())
.doOnNext(otherUsers -> {
List<String> names = new ArrayList<>();
for(OtherUser otherUser: otherUsers){
names.add(otherUser.getDisplayName());
}
String[] userNames = names.toArray(new String[names.size()]);
view.onUserNamesLoaded(userNames);
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(otherUsers -> view.onUsersLoaded(otherUsers),
view::handleError);
disposables.add(disposable);
}
public void getUsers(){
一次性用品=RxUtil.initDisposables(一次性用品);
一次性使用=userApiRepository.getUsers()
.subscribeOn(Schedulers.io())
.doOnNext(其他用户->{
列表名称=新的ArrayList();
for(其他用户其他用户:其他用户){
name.add(otherUser.getDisplayName());
}
String[]userNames=names.toArray(新字符串[names.size()]);
视图。已加载OnUserNames(用户名);
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(其他用户->查看.onUsersLoaded(其他用户),
视图::handleError);
一次性。添加(一次性);
}
我不喜欢doOnNext中的这种方法,因为我认为它可以改进,但不确定如何改进
有人能写出更好的解决方案吗
userApiRepository
.getUsers()
.subscribeOn(Schedulers.io())
.flatMapIterable(users -> users)
.map(OtherUser::getDisplayName)
.toList()
.doOnNext(names -> view.onUserNamesLoaded(names.toArray(new String[names.size()])))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(otherUsers -> view.onUsersLoaded(otherUsers),
view::handleError);
编辑:这不做什么原来剪了;我相信以下几点:
userApiRepository
.getUsers()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(otherUsers -> updateViewWithUserNames(otherUsers, view))
.subscribe(otherUsers -> view.onUsersLoaded(otherUsers),
view::handleError);
private void updateViewWithUserNames(List<OtherUsers> otherUsers, View view) {
view.onUserNamesLoaded(otherUsers.stream()
.map(OtherUser::getDisplayName)
.toArray(String[]::new));
}
userapi存储库
.getUsers()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(其他用户->使用用户名更新视图(其他用户,视图))
.subscribe(其他用户->查看.onUsersLoaded(其他用户),
视图::handleError);
私有void updateViewWithUserNames(列出其他用户,查看){
view.onUserNamesLoaded(otherUsers.stream())
.map(其他用户::getDisplayName)
.toArray(字符串[]::new));
}
是-将其移动到您的subscribe()
块中,但它仍然是相同的代码,几乎没有任何更改。我不确定在这种情况下您想要改进什么,除了使用doOnNext
而不是subscribe()
您的代码看起来很好。您可以使用stream代替,view.onUserNamesLoaded(otherUsers.stream().map(OtherUser::getDisplayName).toArray(String[]::new))
,但您是否可以使用代码应该在subscribe
中的map运算符还是有争议的,如果您对…内容感到困扰,开始使用Kotlin,它为您提供了Kotlin Collections API。虽然这可能是正确的,但我不确定这是否真的是一种改进。(而且,视图是从schedulers.io()操纵的,我想知道原始问题的代码为什么起作用。)这行吗?subscribe
中的otherUsers
现在不是字符串列表,而不是OtherUser
列表吗?@EpicPandaForce是的,视图更改应该在observeOn
之后。除此之外,这是主观的。。。我认为你是对的;在这种情况下,它可能应该移动到一个单独的方法。编辑了回复。