Android開發之MVP模式的使用

來源:互聯網
上載者:User

標籤:ges   init   lis   ati   horizon   int   pack   har   tac   

  前幾天發現,在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處理就行了。這種編程模式值得推薦使用。

Android開發之MVP模式的使用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.