2
我一直在使用MVP
体系结构,使用Retrofit
和callbacks
一段时间。我想用RxJava/Android
取代我的回调,但我似乎无法理解应该如何完成。使用RxAndroid MVP Retrofit修改回调
我对拦截器(交互器)的接口:
public interface FoodInterceptor extends MvpInterceptor {
/*void getFoodList(RestCallback<FoodListResponse> callback);*/
Observable getFoodList(Consumer<FoodListResponse> foodListResponseConsumer, Consumer<Throwable> error);
}
然后是拦截器实现:
public class FoodInterceptorImpl implements FoodInterceptor {
@Inject
ApiService mApiService;
@Inject
ErrorUtils mErrorUtils;
@Inject
SchedulerProvider mSchedulerProvider;
@Inject
CompositeDisposable mCompositeDisposable;
@Inject
public FoodInterceptorImpl() {
super();
}
@Override
public Observable<FoodListResponse> getFoodList(Consumer<FoodListResponse> foodListResponseConsumer, Consumer<Throwable> throwable) {
mApiService.getFoodList()
.subscribeOn(mSchedulerProvider.backgroundThread())
.observeOn(mSchedulerProvider.mainThread())
.subscribe(foodListResponse -> Log.d("TAG", "FoodResponse: " + foodListResponse),
throwable1 -> Log.d("TAG", "Throwable: " + throwable));
return ?;
}
@Override
public void unbind() {
}
/*@Override
public void getFoodList(final RestCallback<FoodListResponse> callback) {
mApiService.getFoodList().enqueue(new Callback<FoodListResponse>() {
@Override
public void onResponse(Call<FoodListResponse> call, Response<FoodListResponse> response) {
if (response.isSuccessful()) {
Result<FoodListResponse> result = new Result<>();
FoodListResponse foodListResponse = response.body();
result.setData(foodListResponse);
callback.onSuccess(result);
} else {
mRestError = mErrorUtils.parseResponse(response);
Log.d("Test", "Error: " + mRestError.getMessage());
}
}
@Override
public void onFailure(Call<FoodListResponse> call, Throwable t) {
}
});
}*/
/*@Override
public void cleanup() {
}*/
}
在注释掉的代码,你可以看到我是如何用一个回调做,但Rx要求我退还Observable
。我会怎么做?我如何通知我的发言人数据已被提取?
Presenter的界面:
@PerActivity
public interface FoodPresenter<V extends FoodView, I extends FoodInterceptor> extends MvpPresenter<V, I> {
void renderFoods();
}
而且主讲人:
public class FoodPresenterImpl<V extends FoodView, I extends FoodInterceptor>
extends BasePresenter<V, I> implements FoodPresenter<V, I> {
@Inject
public FoodPresenterImpl(I mvpInterceptor,
SchedulerProvider schedulerProvider,
CompositeDisposable compositeDisposable) {
super(mvpInterceptor, schedulerProvider, compositeDisposable);
}
@Override
public void renderFoods() {
getMvpView().showProgress(true);
getInterceptor().getFoodList(foodListResponse -> {
if (!isViewAttached()) {
return;
}
getMvpView().renderFoods(foodListResponse.getFoodList().getFoodItemList());
getMvpView().showProgress(false);
}, throwable -> {
if (!isViewAttached()) {
return;
}
getMvpView().showProgress(false);
});
}
/*@Override
public void renderFoods() {
getMvpView().showProgress(true);
getInterceptor().getFoodList(new RestCallback<FoodListResponse>() {
@Override
public void onSuccess(Result<FoodListResponse> result) {
if (!isViewAttached()) {
return;
}
getMvpView().renderFoods(result.getData().getFoodList().getFoodItemList());
getMvpView().showProgress(false);
}
@Override
public void onFailure(RestError error) {
}
});
}*/
}
感谢您的回答!但是,如何返回Observable,以及如何将结果传递给Presenter而无需回调?我编辑了我的代码。 – Esteban
您可以在演示者中订阅并处理请求结果。但是你需要使用map来转换结果。你在拦截器中的方法将返回'Observable',并且在这个方法的主体中将返回 'return api.getFoodList()。map(response - > parseResponseAndReturnObjects()) .subscribe(...) .observe (...)' 当你创建'Observable'时,把它们想象成一个流。你可以在流上添加运算符,这会改变数据,比如'map()',其他的会改变像'subscribe()'这样的线程。但是在你调用'subscribe()'之前它会返回观察值 –