首页 > 解决方案 > 在后台线程中使用blockingget安全吗

问题描述

我基本上是在尝试在后台线程中将一个列表映射到 rxjava 中的一个字符串。为此,我使用了阻塞 get。它安全还是有更好的方法。我在这里使用blockingGet 松了我的异步吗?

 private Observable<Movie> getGenreObservable(Movie movie){
    return HttpCall.getRequest().getMovieGenres("").subscribeOn(Schedulers.io())
            .map(new Function<MovieGenreList, List<Genre>>() {
                @Override
                public List<Genre> apply(MovieGenreList movieGenreList) throws Throwable {
                    return movieGenreList.getGenres();
                }
            }).flatMap(new Function<List<Genre>, ObservableSource<List<Genre>>>() {
                @Override
                public ObservableSource<List<Genre>> apply(List<Genre> genres) throws Throwable {
                    return Observable.fromIterable(genres).filter(new Predicate<Genre>() {
                        @Override
                        public boolean test(Genre genre) throws Throwable {
                            for(Integer id:movie.getGenreIds()){
                                if(id == genre.getId()) return true;
                            }
                            return false;
                        }
                    }).toList().toObservable();
                }
            }).map(new Function<List<Genre>, List<String>>() {
                @Override
                public List<String> apply(List<Genre> genres) throws Throwable {
                    return Observable.fromIterable(genres).map(new Function<Genre, String>() {
                        public String apply(Genre genre) {
                            return genre.getName();
                        }
                    }).toList().blockingGet();
                }
            }).map(new Function<List<String>, String>() {
                @Override
                public String apply(List<String> strings) throws Throwable {
                    return Observable.fromIterable(strings).reduce(new BiFunction<String, String, String>() {
                        @Override
                        public String apply(String s, String s2) throws Throwable {
                            return s+", "+s2;
                        }
                    }).blockingGet();
                }
            }).map(new Function<String, Movie>() {
                @Override
                public Movie apply(String s) throws Throwable {
                    movie.setGenreNames(s);
                    return movie;
                }
            });
}

标签: androidrx-java

解决方案


你能不能只使用.flatMap而不是.map,这样就不需要了blockingGet

 private Observable<Movie> getGenreObservable(Movie movie){
    return HttpCall.getRequest().getMovieGenres("").subscribeOn(Schedulers.io())
            .map(new Function<MovieGenreList, List<Genre>>() {
                @Override
                public List<Genre> apply(MovieGenreList movieGenreList) throws Throwable {
                    return movieGenreList.getGenres();
                }
            }).flatMap(new Function<List<Genre>, ObservableSource<List<Genre>>>() {
                @Override
                public ObservableSource<List<Genre>> apply(List<Genre> genres) throws Throwable {
                    return Observable.fromIterable(genres).filter(new Predicate<Genre>() {
                        @Override
                        public boolean test(Genre genre) throws Throwable {
                            for(Integer id:movie.getGenreIds()){
                                if(id == genre.getId()) return true;
                            }
                            return false;
                        }
                    }).toList().toObservable();
                }
            }).flatMap(new Function<List<Genre>, Observable<List<String>>>() {
                @Override
                public List<String> apply(List<Genre> genres) throws Throwable {
                    return Observable.fromIterable(genres).map(new Function<Genre, String>() {
                        public String apply(Genre genre) {
                            return genre.getName();
                        }
                    }).toList();
                }
            }).flatMap(new Function<List<String>, Observable<String>>() {
                @Override
                public String apply(List<String> strings) throws Throwable {
                    return Observable.fromIterable(strings).reduce(new BiFunction<String, String, String>() {
                        @Override
                        public String apply(String s, String s2) throws Throwable {
                            return s+", "+s2;
                        }
                    })
                }
            }).map(new Function<String, Movie>() {
                @Override
                public Movie apply(String s) throws Throwable {
                    movie.setGenreNames(s);
                    return movie;
                }
            });
}

推荐阅读