在RxJava2

时间:2017-09-25 14:37:32

标签: android rx-java2

我刚刚开始使用RxJava并尝试一个示例项目。

我想要实现的是

- >获取对象 - > 其中包含子对象列表 - >检查子列表是否满足谓词条件 - >如果满足

则发出子对象

这是我的POJO

public class UpComingMovies {

@SerializedName("results")
  private List<Movies> results;
}

public class Movies {

@SerializedName("overview")
  private String overview;

@SerializedName("original_language")
  private String originalLanguage;
}

所以,根据我的理解,我可以使用flatMapIterable并将项目转换为多个可观察对象,然后使用filter说给我的电影originalLanguage.equals("en")

这是我试图做的事情

 @GET("movie/upcoming")
Observable<UpComingMovies> getUpComingMovies(@Query("api_key") String apiKey, @Query("page") String page);

private final CompositeDisposable disposables = new CompositeDisposable();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

     disposables.add(RetrofitConnection.getService()
            .getUpComingMovies(Config.API_KEY, "1")
            .flatMapIterable(new Function<UpComingMovies, Iterable<Movies>>() {
                @Override
                public Iterable<Movies> apply(@NonNull UpComingMovies upComingMovies) throws Exception {
                    // no instance(s) of the type variable(s) U exist so that the Observable<U> conforms to a disposable
                    return upComingMovies.getResults();
                }
            })
            .filter(movies -> movies.getVoteCount() > 200).subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new DisposableObserver<Movies>() {
                @Override
                public void onNext(@NonNull Movies movies) {

                }

                @Override
                public void onError(@NonNull Throwable e) {

                }

                @Override
                public void onComplete() {

                }
            }));
}

然而,它没有编译。 Cleary我不知道该怎么做,感谢任何帮助

3 个答案:

答案 0 :(得分:2)

它不编译的原因是因为你正在返回一个observable并且你的函数签名期望迭代:

new Function<UpComingMovies, Iterable<Movies>>() {
    @Override
    public Iterable<Movies> apply(@NonNull UpComingMovies upComingMovies) throws Exception {
        // List<Movies> is iterable
        return upComingMovies.getResults();

    }
}

如果你这样修理,那么你可以做到

...flatMapIterable(...)
    .filter(new Predicate<Movies>() {
        @Override
        public boolean test(Movies movies) throws Exception {
                return movies.originalLanguage.equals("en");
        }
    })...

答案 1 :(得分:1)

我不知道它是否正是你要做的,而是取代

return Observable.fromIterable(upComingMovies.getResults()); 

return upComingMovies.getResults();

如果你想要你的项目编译

答案 2 :(得分:0)

如果我正确理解了您的代码,您会得到一个UpcomingMovies类型的结果(这就是为什么您应该在此使用Single而不是Observable),然后将其展平为多个排放类型为Movies。这就是为什么您的subscribe函数不起作用的原因:它期望UpcomingMovies但得到Movies

这样的事情可能就是你想要的:

@GET("movie/upcoming")
Single<UpComingMovies> getUpComingMovies(@Query("api_key") String apiKey, @Query("page") String page);

RetrofitConnection.getService()
            .getUpComingMovies(Config.API_KEY, "1")
            .flatMapIterable((UpComingMovies upComingMovies) -> { 
                return upComingMovies.getResults(); 
             })
            .filter((Movies movie) -> { 
                return movie.originalLanguage.equals("en"); 
            })
            .subscribe((Movies movie) -> { 
                Log.d("", movie.toString()); 
            });