使用RXJava执行异步任务的推荐方法
我是RxJava新手,我正在尝试了解异步执行长时间运行任务(例如网络请求)的最佳/推荐方法。我已经在网上阅读了很多例子,但希望能得到一些反馈 下面的代码可以工作(它打印“一”、“二”,然后是“User:x”…等等),但我真的应该手动创建/管理线程吗 提前谢谢使用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
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(用户->可观察的)
。请参见以下答案: