Android中MVP框架的使用

Android中MVP框架的使用


MVP不仅仅限于Fragment或Activity,还可以运用到ViewGroup中。使用时可以自行决定把MVP运用到什么地方,前提是view是独立的,这样presenter才能在不与其他 Presenter冲突的情况下控制View。



业务分层

MVP的相关概念

  • M(model)代表的是将会显示在view(UI)中的数据。严格意义上来说, Model指的应该是检索或控制一个Model的业务逻辑层。

  • V(view)是显示数据(model)并且将用户指令(events)传送到presenter以便作用于那些数据的一个接口。View通常含有Presenter的引用。

  • P(presenter)扮演的是“中间人”的作用,且presenter同时引用view和model。

  • Model,View和Presenter三者应解耦。理论上来说presenter和业务逻辑层都是纯旧式的能够与桌面应用或其他任何java应用共享的java代码。如果让Presenter 执行OnClickListener,Presenter就被绑定到了Android平台上。

MVP模式下,从数据库中查询或显示User列表的具体流程如图:
MVP业务逻辑流程图


各层的实现

model层

  • model层属于数据层,负责数据的处理。包括dao操作,net操作,IO操作等。无需进行明确的分层。
  • 在以模块分包的情况下,对应模块可以建立一个Service,负责进行业务的封装。

View层

  • View层可以是一个Activity或者Fragment,继承自MvpActivity或MvpFragment。(MvpActivity或MvpFragment完成界面的相关初始化工作)

MvpActivity类:

  public abstract class MvpActivity extends Activity implements MvpView {
    /**
     * 初始化界面布局
     *
     * @return 布局id
     */
    protected abstract int getLayoutId();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getLayoutId());
        injectViews();
    }

    private void injectViews() {
        ButterKnife.bind(this);// 界面绑定
    }
}

MvpFragment类:

public abstract class MvpFragment extends Fragment {

    protected abstract int getLayoutId();

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(getLayoutId(), container, false);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        injectViews(view);
    }

    /**
     * ButterKnife injection
     *
     * @param view
     */
    private void injectViews(View view) {
        ButterKnife.bind(this, view);
    }
}
  • 实现一个继承自MvpView用于进行界面更新的View接口。

MvpView 类:

/**
 * MvpView是所有view的基类。从根本上说这只是一个空的interface 。
 */
public interface MvpView {
}

例如,实现一个查询数据库并刷新的界面,view接口需提供相关的界面更新接口。
DemoView 类:

public interface DemoView extends MvpView{
    void showProgress();//显示进度条

    void hideProgress();//隐藏进度条

    void setItems(List<String> items);//更新数据

    void showMessage(String message);//显示提示
}

presenter层

  • 界面业务逻辑控制中心,presenter继承MvpPresenter。

MvpPresenter类:

public class MvpPresenter<V extends MvpView> {

    protected V viewDelegate;

    public MvpPresenter() {
    }

    /**
     * 保存状态
     */
    public void onSaveInstanceState(Bundle outState) {
    }

    /**
     * 恢复状态
     */
    public void onRestoreInstanceState(Bundle savedInstanceState) {
    }

    public void onCreated(Bundle savedInstanceState) {
    }

    public void onResume() {
    }

    public void onPause() {
    }

    /**
     * 进行一些资源的释放
     */
    public void onDestroy() {
        viewDelegate = null;
    }
}

MvpPresenter包含生命周期相关的一些方法,子类可重写相关方法,实现相关业务逻辑。重写onSaveInstanceState与onRestoreInstanceState,在屏幕旋转或生命周期遭到破坏时,进行数据的缓存与恢复。onDestroy()方法用于相关资源的释放

view层创建一个presenter对象,presenter持有相关的view对象。


MVP的使用

  • 创建一个 View 继承 MvpView,提供界面更新的相关接口。

  • 创建一个 Activity 继承自 MvpActivity 或创建一个继承自 MvpFragment 的 Fragmen,重写 getLayoutId() 方法。实现View接口,实现界面的更新操作。Activity只关心界面的更新操作,不涉及具体的业务逻辑。

  • 创建 Presenter 继承 MvpPresenter,完成界面的各项业务逻辑。

  • Activity 在onCreate() 方法实例化一个 Presenter 对象,并传人当前 View,Activity 通过调用 Presenter 对象的相关方法完成实现业务,Presenter 通过调用 View 的相关接口来更新Activity 界面。


源码下载

示例源码下载:
https://github.com/wobuaihuangjun/DatabaseManager


参考文章:http://www.open-open.com/lib/view/open1432779807863.html


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值