在后台线程中,我基本上是想把一个List映射到rxjava中的一个字符串上,为此,我使用了blocking get,这是否安全,是否有更好的方法。
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;
}
});
}
你可以直接使用 .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;
}
});
}