android - 在后台线程中使用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;
}
});
}
解决方案
你能不能只使用.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;
}
});
}
推荐阅读
- shell - 输出pdf ghostscript中的纸张尺寸不合适
- vb.net - 如何在 VS 中运行独立的 vb.net 类代码
- python - Tensorflow - 对多个图像进行批量预测
- c# - 尝试从本地主机中的反应应用程序访问控制器时获取 net::ERR_CONNECTION_REFUSED
- python - python中如何将列表中的字典转换为DataFrame?
- angular - 将 Angular App 部署到域“username.github.io”
- oracle - Issue with opening Oracle VM Virtualbox in Windows 10
- javascript - Boostrap Datepicker - months and year only doesn't work
- ios - record(forDuration:) method stops on its own
- prolog - Solving the Graph Coloring with 3 color and lists - Prolog