zoukankan      html  css  js  c++  java
  • Android开发之MVP模式的使用

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

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

      1. 新建测试工程项目:

        

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

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:orientation="vertical"
        tools:context="cn.linjk.testmvp.MainActivity">
    
        <TextView
            android:id="@+id/tv_info"
            android:layout_gravity="center_horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Hello World!"
            android:textAlignment="center"/>
    
        <Button
            android:id="@+id/btn_edit_info"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:text="Modify Info"/>
    </LinearLayout>
    

           

      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处理就行了。这种编程模式值得推荐使用。

  • 相关阅读:
    CSS中的单位简介
    grid-layout
    position
    form
    objects
    个人介绍
    第十二周作业:
    第十一周作业
    第十周web作业
    第九周作业
  • 原文地址:https://www.cnblogs.com/linjk/p/6214957.html
Copyright © 2011-2022 走看看