2017-08-01 52 views
2

我一直在使用MVP体系结构,使用Retrofitcallbacks一段时间。我想用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) { 

      } 
     }); 
    }*/ 
} 

回答

0

让我分解你的逻辑有点:

  1. renderFoods被调用演示者
  2. 主持人呼叫截击,所以它会获取api和返回结果
  3. 拦截器调用mApi.getFoodList()(它应返回Observable)并itnterceptro订阅结果。我会用的λ,所以有可能错过部分:

    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

您可以在演示者中订阅并处理请求结果。但是你需要使用map来转换结果。你在拦截器中的方法将返回'Observable ',并且在这个方法的主体中将返回 'return api.getFoodList()。map(response - > parseResponseAndReturnObjects()) .subscribe(...) .observe (...)' 当你创建'Observable'时,把它们想象成一个流。你可以在流上添加运算符,这会改变数据,比如'map()',其他的会改变像'subscribe()'这样的线程。但是在你调用'subscribe()'之前它会返回观察值 –