在rxjava 1和2

时间:2018-03-09 11:32:53

标签: rx-java rx-java2

我有一个网络呼叫,其中将返回300个ID,我需要为每个id进行网络呼叫,并在列表中对结果进行编译。我试图使用flatmap来做到这一点,但遇到问题。

有没有办法为paral定义线程创建的数量 任何人都可以给我一个并行执行网络调用的例子,以便在android中使用rxjava1和rxjava2快速获得结果。

这是片段中的代码来获取所有记录:

private void subscribeToStories() {
    contentValues.clear();
    if (isOnline()) {
        //Provider provider = Inject.provider();
        subscription =
        new HNewsApi().getTopStories()
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<Post>() {
                    @Override
                    public void onCompleted() {
                        if (!subscription.isUnsubscribed()) {
                            subscription.unsubscribe();
                        }
 //                            new Thread(new Runnable() {
//                                @Override
//                                public void run() {
//                                                   
/ /                                }
//                            }).start();

                    }

                    @Override
                    public void onError(Throwable e) {
                    }

                    @Override
                    public void onNext(final Post total) {
                        contentValues.add(mapStory(total));
                        Inject.dataPersister().persistStories(contentValues);
                        //contentValues.add(mapStory(total));
                        //Log.e("Storytitle",""+total.getTitle());
                    }
                });
    } else {
        stopRefreshing();
    }
}

这是我对rxjava的调用:

    public Observable<Post> getTopStories() {
    return hackerNewsService.getTopStories().limit(20)
            .concatMap(new Func1<List<Long>, Observable<? extends Post>>() {
                @Override
                public Observable<? extends Post> call(List<Long> longs) {
                    return getPostsFromIds(longs);
                }
            });
}


public Observable<Post> getPostsFromIds(List<Long> storyIds) {
    return Observable.from(storyIds)
            .concatMap(new Func1<Long, Observable<Post>>() {
                @Override
                public Observable<Post> call(Long aLong) {
                    return     hackerNewsService.getStoryItem(String.valueOf(aLong));
                }
            });
}

我想执行并行执行并从此处返回Post对象列表而不是Post。

1 个答案:

答案 0 :(得分:0)

flatMap有一个名为maxConcurrency的参数,您可以在其中定义flatMap可以生成的线程数。默认为Integer.MAX_VALUE所以我认为这就是问题。