使用RXJava执行异步任务的推荐方法

使用RXJava执行异步任务的推荐方法,java,asynchronous,rx-java,Java,Asynchronous,Rx Java,我是RxJava新手,我正在尝试了解异步执行长时间运行任务(例如网络请求)的最佳/推荐方法。我已经在网上阅读了很多例子,但希望能得到一些反馈 下面的代码可以工作(它打印“一”、“二”,然后是“User:x”…等等),但我真的应该手动创建/管理线程吗 提前谢谢 public void start() throws Exception { System.out.println("one"); observeUsers() .flatMap(users -> Ob

我是RxJava新手,我正在尝试了解异步执行长时间运行任务(例如网络请求)的最佳/推荐方法。我已经在网上阅读了很多例子,但希望能得到一些反馈

下面的代码可以工作(它打印“一”、“二”,然后是“User:x”…等等),但我真的应该手动创建/管理线程吗

提前谢谢

public void start() throws Exception {
    System.out.println("one");
    observeUsers()
        .flatMap(users -> Observable.from(users))
        .subscribe(user -> System.out.println(String.format("User: %s", user.toString()));
    System.out.println("two");
}

Observable<List<User>> observeUsers() {
    return Observable.<List<User>>create(s -> {
        Thread thread = new Thread(() -> getUsers(s));
        thread.start();
    });
}

void getUsers(final Subscriber s) {
    s.onNext(userService.getUsers());
    s.onCompleted();
}

// userService.getUsers() fetches users from a web service.
public void start()引发异常{
系统输出打印项次(“一”);
观察者()
.flatMap(用户->可观察的.from(用户))
.subscribe(user->System.out.println(String.format(“用户:%s”,user.toString()));
System.out.println(“两个”);
}
可观测观测者(){
返回可观察。创建(s->{
线程线程=新线程(()->getUsers);
thread.start();
});
}
无效getUsers(最终订户){
s、 onNext(userService.getUsers());
s、 未完成();
}
//getUsers()从web服务获取用户。

不要管理自己的线程,请尝试使用操作符。这意味着将
observeUsers()
替换为
Observable.defer(()->Observable.just(userService.getUsers())
。然后您可以使用来控制订阅和观察期间使用的线程。下面是根据上述建议修改的代码

Observable.defer(() -> Observable.just(userService.getUsers()))
        .flatMap(users -> Observable.from(users))
        .subscribeOn(Schedulers.newThread())
        .observeOn(Schedulers.trampoline())
        .subscribe(user -> System.out.println(String.format("User: %s", user.toString()));

另外,您可以使用
RxJavaAsyncUtil
中的
fromFunc0
,而不是使用
defer()
。请参见以下答案:
Observable.fromFunc0(()->->userService.getUsers())
。此外,您可以使用
flatMap(用户->Observable.from(用户)
而不是
.flatMap(用户->可观察的)
。请参见以下答案: