2017-08-01 4 views
2

Retrofitcallbacksのアーキテクチャを使用しています。私は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) { 

      } 
     }); 
    }*/ 
} 

答えて

0

私はあなたに少しロジックを分解してみましょう:

  1. renderFoodsはプレゼンター
  2. プレゼンターコールintercepterに呼び出されますそれで、それはAPIと戻り値
  3. インターセプタコールmApi.getFoodList()(それはObservableを返す必要があります)、itnterceptroはresultにサブスクライブします。私は、ラムダを使用しますので、見逃した部分があることができます:

    mApi.getFoodList() 
        .subscribeOn(Schedulers.io()) // main work will be on io thread 
        .observeOn(AndroidSchedulers.mainThread()) // result will be passed to main thread 
        .subscribe((result, throwable) -> { 
        // it's like your calback, the job are done 
        // and you get result in result parameter, 
        // and if error occurs, result will be null 
        // and throwable parameter has an cause 
        // so, here you can apply errorUtils on result, check the throwable, 
        // or pass result to your presenter 
        }); 
    

はそれが役に立てば幸い!

+0

あなたの答えをありがとう!しかし、Observableを返すにはどうしたらいいですか?コールバックを使わずにPresenterに結果を渡すにはどうすればいいですか?私は自分のコードを編集しました。 – Esteban

+0

プレゼンターで購読してリクエスト結果を処理できます。しかし、マップを使用して結果を変換する必要があります。インターセプタでのあなたの方法は、観察可能な ''を返します。このメソッドの本体に 'api.getFoodListを返す()マップ(レスポンス - > parseResponseAndReturnObjects())になります。 .subscribe(...) .observe (...) ' ' Observable'を作成するとき、それらをストリームとして考える。 'map()'のようにデータを変更する演算子をストリーム上に追加することができます。他のものは 'subscribe()'のようなスレッドを変更します。しかし、あなたが 'subscribe()'を呼び出すまで観測可能な状態に戻ります。 –

関連する問題