在MVP模式中哪里做HTTP请求?

时间:2018-02-24 03:06:22

标签: android mvp

我想用Retrofit做GET请求,但我不知道我需要在哪一层MVP模式上做。据我所知,Model将所有数据发送到Presenter,然后,Presenter在View上显示数据。所以,我认为最好的地方是模特。但Presenter如何知道Model已经获取所有数据并准备将其传递给Presenter?为此,我认为我需要使用在Model完成加载数据时通知Presenter的界面。但谷歌搜索什么是最好的方式,我看到开发人员使用像存储库和管理器这样的东西。但我无法弄清楚每个人的作用。那么,如何解决这个问题呢?在MVP模式中创建HTTP请求的最佳位置是什么?如果是Model,将所有数据发送到Presenter的最佳方法是什么?

1 个答案:

答案 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
                    }
                });
    }