美文网首页
Android MVP框架

Android MVP框架

作者: 九馆 | 来源:发表于2019-09-29 14:29 被阅读0次

    MVP即:Model层(模型层)、View层(视图层)、Presenter(中间层)

    MVP模型图
    mvp.png
    优点:

    解决了MVC中Contreller与View过度耦合的缺点,职责划分明显,更加易于维护

    缺点:

    接口数量多,项目复杂度升高。随着项目复杂度的提升,Presenter层将越来越臃肿

    MVP实现需求

    1.MVPActivity负责提供View层面的功能(采用接口实现的方式)
    2.MVPModel负责提供数据方面的功能
    3.Model与View不再直接通信,通过presenter来实现


    mvp.png
    使用MVP的建议

    1.接口规范化(封装父类接口以减少接口的使用量)
    2.使用第三方插件自动生成MVP代码
    3.对于一些简单的界面,可以选择不使用框架
    4.根据项目复杂程度,部分模块可以选择不使用接口

    布局文件

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".framework_mode.normal.NormalActivity">
    
        <EditText
            android:id="@+id/ed_account"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="50dp"
            android:hint="请输入要查询的账号"/>
    
        <Button
            android:id="@+id/btn_get_account"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="80dp"
            android:text="获取账号信息"/>
    
        <TextView
            android:id="@+id/tv_result"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="80dp"
            android:hint="账号信息暂未获取"/>
    </LinearLayout>
    

    实体类

    /**
     * 账号信息
     * @author Administrator
     */
    public class Account {
    
        /** 账号名称 */
        private String name;
        /** 账号等级 */
        private int level;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getLevel() {
            return level;
        }
    
        public void setLevel(int level) {
            this.level = level;
        }
    }
    

    接口代码

    public interface IMVPView {
    
        /**
         * 获取用户输入信息
         * @return
         */
        String getUserInput();
    
        /**
         * 展示获取数据成功的界面
         * @param account
         */
        void showSuccessPage(Account account);
    
        /**
         * 展示获取数据失败的界面
         */
        void showFailedPage();
    }
    

    Model

    /**
     * Model层
     * 数据处理(网络请求、SQL等)
     * @author Administrator
     */
    public class MVPModel {
    
        /**
         * 模拟获取账号数据
         * @param accountName
         * @param callback
         */
        public void getAccountData(String accountName, MCallback callback) {
            Random random = new Random();
            boolean isSuccess = random.nextBoolean();
            if (isSuccess) {
                Account account = new Account();
                account.setName(accountName);
                account.setLevel(100);
                callback.onSuccess(account);
            } else {
                callback.onFailed();
            }
        }
    }
    

    Presenter

    public class MVPPresenter {
        private IMVPView mView;
        private MVPModel mModel;
    
        public MVPPresenter(IMVPView mView) {
            this.mView = mView;
            mModel = new MVPModel();
        }
    
        public void getData(String accountName){
            mModel.getAccountData(accountName, new MCallback() {
                @Override
                public void onSuccess(Account account) {
                    mView.showSuccessPage(account);
                }
    
                @Override
                public void onFailed() {
                    mView.showFailedPage();
                }
            });
        }
    }
    

    View

    public class MVPActivity extends AppCompatActivity implements View.OnClickListener, IMVPView {
    
        /** 展示查询结果 */
        private TextView mTvResult;
        /** 用户输入的信息 */
        private EditText mEtAccount;
        private MVPPresenter mvpPresenter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_normal);
    
            initView();
            mvpPresenter = new MVPPresenter(this);
        }
    
        /**
         * 初始化View
         */
        private void initView() {
    
            mTvResult = findViewById(R.id.tv_result);
            mEtAccount = findViewById(R.id.ed_account);
            findViewById(R.id.btn_get_account).setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            mvpPresenter.getData(getUserInput());
        }
    
        @Override
        public String getUserInput() {
            return mEtAccount.getText().toString();
        }
    
        @Override
        public void showSuccessPage(Account account) {
            mTvResult.setText("用户账号:" + account.getName() + "|" + "用户等级:" + account.getLevel() );
        }
    
        @Override
        public void showFailedPage() {
            mTvResult.setText("获取数据失败");
        }
    }
    

    相关文章

      网友评论

          本文标题:Android MVP框架

          本文链接:https://www.haomeiwen.com/subject/rxytpctx.html