MVP小白入门,只需5步

前言:因为公司氛围没有用,一直很火的mvp模式像鬼一样听说过没见过,今天闲来无事了解一下,发现由普通的MVC改起来还是挺行云流水的,但像有些弹窗不知道写在P层还是V层
关于MVP的概念我就不详细说了,记住关键的一点就是将view与逻辑分离
在谷歌推荐写法下,M层被弱化,数据处理放在了P层

1.定义一个P接口

public interface BasePresenter {
    boolean something();
}

2.定义一个V接口

public interface BaseView<P extends BasePresenter> {
    void setPresenter(P presenter);
}

3.定义一个合约类管理上述两个接口,Presenter用于定义界面的逻辑与数据,View 用于定义对应的界面显示

public class DateRecordContract {
    interface Presenter extends BasePresenter {
        //获取今日数据
        void getTodayData();
        //获取所有数据
        void getAllData();
        //检查数据是否有效
        void checkData();
        //插入一条数据
        void insertDateBean();
        //开始计时
        void startTiming();
    }

    interface View extends BaseView<Presenter> {
        //显示计时界面
        void startAnim();
        //刷新界面
        void refreshUI(List<DateRecordBean> data);
        //停止计时界面
        void stopAnim();
        //刷新一个界面
        void refreshOneDate(DateRecordBean bean);
        //保存输入的文本
        void saveInputtext(String str);
        //获得当前的文本
        String getCurrenttext();
        //隐藏输入法
        void hideInput();
    }


}

4.定义一个P层实现类,最好放在上面的接口同一个包下

public class DateRecordPresenterImpl implements DateRecordContract.Presenter {
    private DateRecordContract.View view;
    private SharedPreferencesHelper spHelper;

    public DateRecordPresenterImpl(DateRecordContract.View view,SharedPreferencesHelper sp) {
        this.view = view;
        view.setPresenter(this);
        spHelper = sp;
    }

    @Override
    public void getTodayData() {
        //..处理数据
        List<DateRecordBean> list = ...;
        //..通知view刷新界面
        view.refreshUI(list);
    }

    @Override
    public void getAllData() {
        List<DateRecordBean> list = ...;
        //
        view.refreshUI(list);
    }

    @Override
    public void checkData() {

    }

    @Override
    public void insertDateBean() {
        long endTime = System.currentTimeMillis();
        DateRecordBean bean = new DateRecordBean();
        //..数据处理

        //处理完数据后通知view刷新界面
        view.refreshOneDate(bean);
    }

    @Override
    public void startTiming() {
        view.hideInput();
        view.startAnim();

        spHelper.put(SharedPreferencesHelper.isStartTime, true);

        view.saveInputtext(str);
    }
    @Override
    public boolean something() {
        //...自己的处理逻辑
        return isStartRecord;
    }
}

5.定义一个View实现类,根据回调显示UI

public class MainActivity extends AppCompatActivity implements DateRecordContract.View {
private DateRecordPresenterImpl presenter;
  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        presenter = new DateRecordPresenterImpl(this,spHelper);
        //通知P层获得今日数据
        presenter.getTodayData();
    }


    @Override
    public void refreshUI(List<DateRecordBean> data) {
        //显示P层处理好的数据
        dapter.addBeans(data);
    }
}

以上就是简单的MVP入门,哪里出问题了直接在合约类查看,还是挺方便,也可以把MainActivity改为Fragment实现View,有些疑问是不知道把Dialog放在哪,目前还是放在了Activity中
2018年9月5日08:02:16

上一篇:Android截取string中的空字符


下一篇:重新理解Activity启动模式,确认返回按钮到哪个界面