Reputation: 1302
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
I want to know how to pass observable using defer or fromCallable using retrofit2
I would like to know how to use lambda on subscribe
Upvotes: 1
Views: 1707
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
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