[英]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个问题
我想知道如何使用defer传递observable或使用retrofit2传递fromCallable
我想知道如何在订阅时使用lambda
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.