標籤: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模式的使用