【问题标题】:Recommended way to execute async tasks with RXJava使用 RXJava 执行异步任务的推荐方法
【发布时间】:2015-07-23 17:13:47
【问题描述】:

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

以下代码有效(它打印“一”、“二”,然后是“用户: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.

【问题讨论】:

    标签: java asynchronous rx-java


    【解决方案1】:

    尝试使用defer() 运算符,而不是管理您自己的线程。意思是将observeUsers() 替换为Observable.defer(() -&gt; Observable.just(userService.getUsers()))。然后您可以使用RxJava Schedulers 来控制订阅和观察期间使用哪些线程。这是根据上述建议修改的代码。

    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( )。请参阅此答案:stackoverflow.com/a/31515376/1796309。示例:Observable.fromFunc0(() -&gt; userService.getUsers())。此外,您可以使用.flatMapIterable(users -&gt; users) 而不是.flatMap(users -&gt; Observable.from(users))。看到这个答案:stackoverflow.com/a/31580725/1796309
    猜你喜欢
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 2013-01-07
    相关资源
    最近更新 更多