博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android开发之MVP模式的使用
阅读量:4311 次
发布时间:2019-06-06

本文共 3891 字,大约阅读时间需要 12 分钟。

  前几天发现,在Android项目代码里有一个Activity类行数居然有1000多行,而600行左右都是逻辑控制,真正和页面控件处理相关的代码不多,虽然可以用#region <>...#endregion块包起来,但是整体来说,页面和逻辑处理揉得太紧密了,有时代码复用起来也不方便,于是,决定重构,找了一下,有MVP(Model-View-Presenter,Model层负责数据管理,View层负责页面控件数据展示与设置,Presenter负责逻辑处理,控制View层如何显示与展示数据,这种层次设计,虽然代码文件多了,但是整体逻辑划分很清晰,对于团队分工和测试很方便)风格的架构还不错,了解了一下,不难,弄了半天,虽然多了几个代码文件和函数,但是原来那个Activity类行数缩减为400多行,逻辑看起来清爽多了。

  现在新建一个测试工程,来说明一下MVP是怎么使用的:

  1. 新建测试工程项目:

    

  2. 修改界面文件为如下:

       

  3. 增加界面修改接口:    

package cn.linjk.testmvp.views;/** * Created by LinJK on 24/12/2016. */public interface IMainView {    String getTextViewInfo();    void setTextViewInfo(String info);}

   4. 在MainActivity实现这个界面修改接口IMainView:

package cn.linjk.testmvp;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.Button;import android.widget.TextView;import cn.linjk.testmvp.views.IMainView;public class MainActivity extends AppCompatActivity    implements IMainView{    private TextView tvIninfo;    private Button   btnModifyInfo;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initViewComponents();    }    @Override    public String getTextViewInfo() {        return tvIninfo.getText().toString();    }    @Override    public void setTextViewInfo(String info) {        tvIninfo.setText(info);    }    private void initViewComponents() {        tvIninfo = (TextView) findViewById(R.id.tv_info);        btnModifyInfo = (Button) findViewById(R.id.btn_edit_info);    }}

   5.增加MainActivity控制器接口IMainViewPresenter,用于控制界面的显示与内容设置逻辑:

package cn.linjk.testmvp.presenters;/** * Created by LinJK on 24/12/2016. */public interface IMainViewPresenter {    void modifyTextViewInfo(String isssnfo);}

   6.实现控制器接口:

package cn.linjk.testmvp.presenters;import cn.linjk.testmvp.views.IMainView;/** * Created by LinJK on 24/12/2016. */public class MainViewPresenter implements IMainViewPresenter{    private IMainView iMainView;    public MainViewPresenter(IMainView pIMainView) {        this.iMainView = pIMainView;    }    @Override    public void modifyTextViewInfo(String info) {        iMainView.setTextViewInfo(info);    }}

   7. 在MainActivity增加控制器,增加控制逻辑,修改MainActivity后代码如下:

package cn.linjk.testmvp;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.TextView;import cn.linjk.testmvp.presenters.MainViewPresenter;import cn.linjk.testmvp.views.IMainView;public class MainActivity extends AppCompatActivity    implements IMainView{    private TextView tvIninfo;    private Button   btnModifyInfo;    private MainViewPresenter mainViewPresenter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initViewComponents();        initGlobalVars();    }    @Override    public String getTextViewInfo() {        return tvIninfo.getText().toString();    }    @Override    public void setTextViewInfo(String info) {        tvIninfo.setText(info);    }    private void initViewComponents() {        tvIninfo = (TextView) findViewById(R.id.tv_info);        btnModifyInfo = (Button) findViewById(R.id.btn_edit_info);        btnModifyInfo.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                mainViewPresenter.modifyTextViewInfo("Android MVP");            }        });    }    private void initGlobalVars() {        mainViewPresenter = new MainViewPresenter(this);    }}

    8. 此时运行代码,完成目的。


 

   从上面代码逻辑可以看到,用这种方式编写代码,MainActivity类逻辑很清晰,不存在太多的逻辑控制代码,逻辑控制都在控制器处理了,这样在团队分工也容易分配,只要把业务接口写好了,就可以把接口分配人员去实现,当然,也有一个缺点是这样在项目复杂后很容易达到65535这个方法数限制,这样另外分DEX处理就行了。这种编程模式值得推荐使用。

转载于:https://www.cnblogs.com/linjk/p/6214957.html

你可能感兴趣的文章
mysql函数技巧整理
查看>>
二叉树
查看>>
IO多路复用--epoll详解
查看>>
[线段树优化应用] 数星星Star
查看>>
表单序列化以及后台表单数据参数的提取
查看>>
SQL语句(十五)视图
查看>>
nginx 设置开机启动
查看>>
继承和组合
查看>>
小程序-----上传图片
查看>>
工作流表单自定义的误区
查看>>
带有循环功能的存储过程
查看>>
数据结构-链表插入节点
查看>>
软件项目开发流程
查看>>
常用排序算法
查看>>
DOM(文档对象模型)
查看>>
为什么要安全域,哪些区域需要单独划分安全域
查看>>
【BZOJ5297】【CQOI2018】社交网络(矩阵树定理)
查看>>
【BZOJ1921】【CTSC2010】珠宝商(点分治,后缀自动机)
查看>>
追寻生命的意义
查看>>
Something wrong with iPad
查看>>