在MVP模式中,HTTP请求应该放在哪里?

3

我希望用Retrofit做一个GET请求,但是我不知道在MVP模式中需要在哪一层进行。据我所知,Model会将所有数据发送给Presenter,然后Presenter会在View上显示这些数据。所以,我认为最好的地方是在Model中进行请求。但是Presenter怎么知道Model已经获取了所有数据并准备把它传递给Presenter呢?为此,我认为需要使用接口通知Presenter当Model完成加载数据时。但是,在搜索了最佳方法之后,我发现开发人员使用类似Repositories和Managers的东西。但是我不确定它们各自的作用是什么。那么,如何解决问题呢?在MVP模式中,最佳位置来创建HTTP请求是什么?如果是在Model中,最佳方式是将所有数据发送给Presenter吗?


2
遵循谷歌的示例:https://github.com/googlesamples/android-architecture - Jared Burrows
1
MVP是UI模式,您的Presenter可以通过UseCase(或Interactor)与Repository(或DataSource)进行交互。在MVP中,Model定义了UI的状态,Presenter定义了展示逻辑,而View则呈现了您的Model并侦听了与框架相关的内容。其思想是用不同的平台替换您的View,这就足以使整个MVP部分工作。 - Viktor Yakunin
1个回答

1
您需要的是从模型到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() {
                       //act on complete
                    }

                    @Override
                    public void onError(Throwable e) {
                        //act on error
                    }

                    @Override
                    public void onNext(Response<GetBannersResponse> getBannersResponseResponse) {
                       //act on result received
                    }
                });
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接