您需要的是从模型到Presenter的回调结构。我通常使用并推荐使用RxJava,retrofit2已经有了返回Observable对象的选项,这使得一切都变得更加容易。
假设您有一个像这样的端点,这是一个返回observable的retrofit响应:
@Headers({"Content-Type: application/json", "Accept: application/json"})
@GET("/api/v1/banners")
Observable<Response<GetBannersResponse>> getBanners(
@Header("Authorization") String auth_token);
GetBannersResponse类只是一个POJO,用于封装我的JSON响应:
public class GetBannersResponse {
List<Banner> banners;
public List<Banner> getBanners() {
return banners;
}
public void setBanners(List<Banner> banners) {
this.banners = banners;
}
}
我的模型(互动器)类,我喜欢称之为DataHandler,看起来像这样:
public class MyDataHandler implements MyDataHandlerContract.DataHandler {
private RetrofitAPI theCloud;
private PreferencesUtil prefs;
@Inject
public CatalogDataHandler(TaskrAPIConfig theCloud, PreferencesUtil prefs) {
this.theCloud = theCloud;
this.prefs = prefs;
}
@Override
public Observable<Response<GetBannersResponse>> getBanners() {
return theCloud.getApiService().getBanners(prefs.getTokenFormatted());
}
}
你可以看到我从Retrofit调用中返回了可观察对象。然后在我的Presenter中,我只需订阅此可观察对象并相应地进行操作:
@Override
public void getBanners() {
dataHandler
.getBanners()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response<GetBannersResponse>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Response<GetBannersResponse> getBannersResponseResponse) {
}
});
}