fiddlest
fiddlest

Reputation: 1302

rxandroid lambda with retrofit

I am trying to get Observable from repository. I am wondering if I can pass observable using defer or fromCallable. None of the thing I tried did not work.. So can anyone give me some sample code that demonstrate how to pass observable with defer or fromCallable?

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

Repository Code

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

In fragment I am getting Observable like this ( getting uncheck call warning)

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

How can I shorten my code using lambda ? I have tried like this but It does not recognize argument( 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);

});

I basically have 3 questions

  1. I want to know how to pass observable using defer or fromCallable using retrofit2

  2. I would like to know how to use lambda on subscribe

  3. Am I using rxandroid correctly ?

Upvotes: 1

Views: 1707

Answers (2)

Vardaan Sharma
Vardaan Sharma

Reputation: 336

Lambdas are added in the java8 and android as of now does not support it :(. But you can still use lambdas using retrolambda plugin.

Follow this link for getting started with retrolambda

and for using defer in rx you need do something like this

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

Hope this helps :)

Upvotes: 0

zayn
zayn

Reputation: 684

1: Passing the observable to pass as any other object, You can use the same framework as the eventBus or rxbus

2: use lambda like this

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

  };

and the struct is:

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


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

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

Upvotes: 1

Related Questions