2
Retrofit
とcallbacks
のアーキテクチャを使用しています。私はRxJava/Android
と私のコールバックを交換したいと思いますが、私はそれがどのようにすべきかについて把握していないようです。RxAndroid MVPでコールバックを変更する
私はインターセプタ(インターアクター)のためのインターフェースがあります:あなたは私がコールバックでそれを行うだろうか見ることができ、コメントコードで
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() {
}*/
}
:
public interface FoodInterceptor extends MvpInterceptor {
/*void getFoodList(RestCallback<FoodListResponse> callback);*/
Observable getFoodList(Consumer<FoodListResponse> foodListResponseConsumer, Consumer<Throwable> error);
}
そしてインターセプターの実装をRxは私にObservable
を返すように要求しました。どうすればいい?また、データが取得されたことをプレゼンターに知らせるにはどうすればよいですか?
プレゼンターインタフェース:
@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
プレゼンターで購読してリクエスト結果を処理できます。しかし、マップを使用して結果を変換する必要があります。インターセプタでのあなたの方法は、観察可能な ''を返します。このメソッドの本体に 'api.getFoodListを返す()マップ(レスポンス - > parseResponseAndReturnObjects())になります。 .subscribe(...) .observe (...) ' ' Observable'を作成するとき、それらをストリームとして考える。 'map()'のようにデータを変更する演算子をストリーム上に追加することができます。他のものは 'subscribe()'のようなスレッドを変更します。しかし、あなたが 'subscribe()'を呼び出すまで観測可能な状態に戻ります。 –