我正试图从存储库中获取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个问题
我想知道如何使用retrofit2使用defer或fromCallable传递observable
我想知道如何在订阅上使用lambda
答案 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。
并且在rx中使用defer你需要做这样的事情
Observable.defer(() -> movieApiService.getMovieList2(sortBy,apiKey,number).compose(applySchedulers());
希望这会有所帮助:)