rxandroid lambda改造

时间:2016-03-01 03:00:03

标签: android rx-java observable rx-android

我正试图从存储库中获取Observable。我想知道我是否可以使用defer或fromCallable传递observable。我尝试过的东西都没有用。 那么有人能给我一些示例代码来演示如何使用defer或fromCallable传递observable吗?

Retrofit      
@GET("3/discover/movie")
    Observable<MovieDataContainer> getMovieList2(@Query("sort_by") String sort,@Query("api_key") String api_key,@Query("page") int page);

存储库代码

   public <T> Observable.Transformer<T, T> applySchedulers() {
    return observable -> observable.subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread());
}
 @Override
    public Observable<MovieDataContainer> getMovieByFilter(String sortBy, String apiKey, int number) {
        MovieApiService movieApiService=mMovieRetrofit.createService(MovieApiService.class);
        return movieApiService.getMovieList2(sortBy,apiKey,number).compose(applySchedulers());
    }

在片段中我得到像这样的Observable(获取取消选中调用警告)

   Observable movieObservable  = new MovieApiRepository(new MovieRetrofit()).getMovieByFilter("popularity.desc", BuildConfig.MOVIE_DB_API_KEY, 1);

    movieObservable.subscribe(new Observer<MovieDataContainer>() {
        @Override
        public void onCompleted() {
        }
        @Override
        public void onError(Throwable e) {
        }
        @Override
        public void onNext(MovieDataContainer movieDataContainer) {
            MoviePosterGridAdapter movieAdapter=
                    new MoviePosterGridAdapter(
                            getActivity().getApplicationContext(),
                            R.layout.movie_poster_imageview,
                            movieDataContainer.getResults()
                    );
            GridView grid  = (GridView) getView().findViewById(R.id.movie_grid);
            grid.setAdapter(movieAdapter);
        }
    });

如何使用lambda缩短代码? 我试过这样但它不承认参数(movieContainer)

movieObservable.subscribe(movieContainer->{
        MoviePosterGridAdapter movieAdapter=
                new MoviePosterGridAdapter(
                        getActivity().getApplicationContext(),
                        R.layout.movie_poster_imageview,
                        movieDataContainer.getResults()
                );
        GridView grid  = (GridView) getView().findViewById(R.id.movie_grid);
        grid.setAdapter(movieAdapter);

});

我基本上有3个问题

  1. 我想知道如何使用retrofit2使用defer或fromCallable传递observable

  2. 我想知道如何在订阅上使用lambda

  3. 我正确使用rxandroid吗?

2 个答案:

答案 0 :(得分:1)

1:传递observable以传递任何其他对象,您可以使用与eventBus或rxbus相同的框架

2:像这样使用lambda

    movieObservable.subscribe{ movieContainer->
        MoviePosterGridAdapter movieAdapter=
                new MoviePosterGridAdapter(
                        getActivity().getApplicationContext(),
                        R.layout.movie_poster_imageview,
                        movieDataContainer.getResults()
                );
        GridView grid  = (GridView) getView().findViewById(R.id.movie_grid);
        grid.setAdapter(movieAdapter);

  };

,结构是:

observable.subscribe{ onNext-> 
     //you code
};


observable.subscribe({ onNext-> 
     //you code
},{ error ->
    Log.e(error);
});

observable.subscribe({ onNext-> 
     //you code
},{ error ->
    Log.e(error);
},{
   //onComplete..
});

答案 1 :(得分:0)

Lambda在java8和android中添加,因为现在不支持它:(。 但你仍然可以使用retrolambda插件使用lambdas。

按照此https://github.com/Azure/azure-mobile-services/blob/master/sdk/android/src/sdk/src/main/java/com/microsoft/windowsazure/mobileservices/table/MobileServiceTable.java#L349开始使用retrolambda

并且在rx中使用defer你需要做这样的事情

  Observable.defer(() -> movieApiService.getMovieList2(sortBy,apiKey,number).compose(applySchedulers());

希望这会有所帮助:)