我想用Retrofit做GET请求,但我不知道我需要在哪一层MVP模式上做。据我所知,Model将所有数据发送到Presenter,然后,Presenter在View上显示数据。所以,我认为最好的地方是模特。但Presenter如何知道Model已经获取所有数据并准备将其传递给Presenter?为此,我认为我需要使用在Model完成加载数据时通知Presenter的界面。但谷歌搜索什么是最好的方式,我看到开发人员使用像存储库和管理器这样的东西。但我无法弄清楚每个人的作用。那么,如何解决这个问题呢?在MVP模式中创建HTTP请求的最佳位置是什么?如果是Model,将所有数据发送到Presenter的最佳方法是什么?
答案 0 :(得分:1)
您需要的是从模型到演示者的回调结构。我通常使用和推荐的是使用RxJava,retrofit2已经有一个返回Observable对象的选项,这使得一切变得更容易。
假设您有一个像这样的端点,这是一个返回可观察的改进响应:
@Headers({"Content-Type: application/json", "Accept: application/json"})
@GET("/api/v1/banners")
Observable<Response<GetBannersResponse>> getBanners(
@Header("Authorization") String auth_token);
GetBannersResponse类只是一个封装我的json响应的POJO:
public class GetBannersResponse {
List<Banner> banners;
public List<Banner> getBanners() {
return banners;
}
public void setBanners(List<Banner> banners) {
this.banners = banners;
}
}
My Model(interactor)类我喜欢调用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调用中返回了observable。然后在我的演示者中,我只是订阅了这个可观察的内容并采取相应的行动:
@Override
public void getBanners() {
dataHandler
.getBanners()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response<GetBannersResponse>>() {
@Override
public void onCompleted() {
//act on complete
}
@Override
public void onError(Throwable e) {
//act on error
}
@Override
public void onNext(Response<GetBannersResponse> getBannersResponseResponse) {
//act on result received
}
});
}