繁体   English   中英

rxandroid lambda与改造

[英]rxandroid lambda with retrofit

我试图从存储库中获取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 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. 我想知道如何使用defer传递observable或使用retrofit2传递fromCallable

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

  3. 我正确使用rxandroid吗?

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..
});

Lambdas已添加到java8和android中,目前尚不支持:(.。但是您仍然可以使用retrolambda插件来使用lambdas。

点击此链接开始使用Retrolambda

为了在rx中使用defer,您需要执行以下操作

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

希望这可以帮助 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM