MVP模式总结

本来一直使用mvc的,也使用了一段时间的mvp,因为接手的项目不大,基本上用mvc就成,但是后面接手的别人的项目,用的mvc,发现整个项目面目全非,有种无从下手的感觉,遂决定抛弃mvc,全都改用mvp,至少给继任者一点小小的帮助!
1.首先是一个公用的OnHttpCallBack接口

public interface OnRequestCallback<T> {
    void onSuccessful(T t);
    void onFaild(String e);
}

很简单的代码,随自己的实际需求修改。
2.然后是一个Contract类

public class TestContract {
    /**
     * M逻辑(业务)处理层
     */
    interface ITestModel {
        void getTestData(String params, OnRequestCallback<TestBean> callBack);//获取数据接口
    }
    /**
     * P视图与逻辑处理的连接层
     */
    interface ITestPresenter {
        void getTestData(String params);//获取数据方法
    }
    /**
     * V视图层
     */
    interface ITestView {
        void showToast(String info);
    }
}

这个中转类是给接口用的,自己查找起来方便一点,就是这样,单纯的懒。接口就这个三个,接口里面的方法随开发的实际需求自行定义。
3.然后就是实现接口了
首先是model

public class TestModel implements TestContract.ITestModel {
    @Override
    public void getTestData(String params, final OnRequestCallback<TestBean> callBack) {
        TestAPI.requestData(params)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<TestBean>() {
                    @Override
                    public void onCompleted() {
                    }
                    @Override
                    public void onError(Throwable e) {
                        if (e instanceof HttpException) {
                            HttpException httpException = (HttpException) e;
                            if (httpException.code() == 500 || httpException.code() == 404) {
                                callBack.onFaild("服务器出错");
                            }
                        } else if (e instanceof ConnectException) {
                            callBack.onFaild("网络断开,请打开网络!");
                        } else if (e instanceof SocketTimeoutException) {
                            callBack.onFaild("网络连接超时!!");
                        } else {
                            callBack.onFaild("发生未知错误" + e.getMessage());
                        }
                    }
                    @Override
                    public void onNext(TestBean response) {
                        callBack.onSuccessful(response);
                    }
                });
    }
}

然后是Presenter

public class TestPresenter implements TestContract.ITestPresenter {
    private TestContract.ITestModel model;
    private TestContract.ITestView view;
    private Context context;

    public TestPresenter(TestContract.ITestView view, Context context) {
        this.view = view;
        this.context = context;
        model = new TestModel();
    }

    @Override
    public void getTestData(String params) {
        model.getTestData(params, new OnRequestCallback<TestBean>() {
            @Override
            public void onSuccessful(TestBean bean) {
                view.showToast(bean.toString());
            }

            @Override
            public void onFaild(String errorMsg) {
                view.showToast(errorMsg);
            }
        });
    }
}

最后是view

public class TestActivity extends AppCompatActivity implements TestContract.ITestView{
    private TestPresenter presenter;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_test);
        presenter = new TestPresenter(this,this);
        presenter.getTestData("test");
    }
    @Override
    public void showToast(String info) {
        Toast.makeText(this,info,Toast.LENGTH_LONG).show();
    }
}

简易后的代码大概是这个样子,很多地方都可以重新优化,有错误请各位大佬指正,不胜感激!至于那个网络请求,我用的是retrofit+rxjava,网络请求这一块可以暂时省略,直接延用原项目的,就这样。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值