我想得到改造的要求,但我不知道我需要在哪一层mvp模式。据我所知,模型将所有数据发送给Presenter,然后Presenter在视图上显示数据。所以,我认为最好的地方是模特。但是演示者如何知道模型已经获取了所有数据并准备将其传递给演示者呢?为此,我认为我需要使用接口,在模型加载完数据后通知演示者。但是,我在google上找到了最好的方法,我发现开发人员使用类似于存储库和管理器的东西。但我不知道他们每个人的角色。那么,如何解决这个问题呢?在mvp模式中创建http请求的最佳位置是什么?如果是模型,那么向演示者发送所有数据的最佳方式是什么?

最佳答案

您需要的是从模型到演示者的回调结构。我通常使用和推荐的是使用rxjava,reformation2已经有了返回可观察对象的选项,这使得一切都变得更加容易。
假设您有一个这样的端点,这是一个更新响应,返回一个可观察的:

@Headers({"Content-Type: application/json", "Accept: application/json"})
@GET("/api/v1/banners")
Observable<Response<GetBannersResponse>> getBanners(
@Header("Authorization") String auth_token);

getBannerResponse类只是封装我的JSON响应的POJO:
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());
    }
}

你可以看到,我正在返回改装呼叫的观测值。那么在我的演示者中,我只是订阅这个可观察的,并相应地采取行动:
 @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
                    }
                });
    }

关于android - 以MVP模式在哪里执行HTTP请求?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48958942/

10-10 09:36