編輯:Android編程入門
最近在開發一個android的項目中,發現了一個很實用的設計模式(MVP)。大家可能一看到這個名字就有點蒙,MVP到底是什麼鬼呢?它的好用到底體現在哪呢?別著急,下面就讓我們一一分享出來。
說到MVP,大家也許就會想到MVC。沒錯,其實他們兩者之間確實有很大的聯系,MVC相比大家都是非常的熟悉了,典型的三層框架。但是MVC在使用的過程中有什麼弊端呢?就我自己的理解是它會導致Control層和Model層銜接太緊密,因為有的時候你必須從Model裡面讀寫數據。而MVP 呢?它是在Model和View之間加了個Presenter層,所有的交互都發生在Presenter層裡面。看到這裡,有的人就會說了,那這不是跟MVC一樣的嗎?我看不出有什麼區別呀?下面就讓我們來看看實際代碼,也許你就能領悟出一些東西了。
假如我前台有這麼個Activity,代碼如下:
public class MyTestActivity extends Activity implements View.OnClickListener { private Button btnTest1,btnTest2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my_test); initView(); setClickLinear(); } private void initView(){ btnTest1=(Button)findViewById(R.id.btnTest1); btnTest2=(Button)findViewById(R.id.btnTest2); } private void setClickLinear(){ btnTest1.setOnClickListener(this); btnTest2.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.btnTest1: break; case R.id.btnTest2: break; } } private void showButton1(){ btnTest1.setVisibility(View.VISIBLE); } private void hiddenButton1(){ btnTest2.setVisibility(View.GONE); } private void showButton2(){ btnTest2.setVisibility(View.VISIBLE); } private void hiddenButton2(){ btnTest2.setVisibility(View.GONE); } }
你可以看到在這段代碼裡面,我只是想要簡單的實現:點擊按鈕1的時候隱藏按鈕2,點擊按鈕2的時候隱藏按鈕1;其實邏輯是很簡單的,我們只需要分開定義好四個方法就可以了。但是如果我現在假如該activity裡面還有其他需求:1.我想要頁面一啟動的時候就請求4張廣告圖片;2.中間有個gradview需要你去填充9宮格;3.需要根據用戶類型顯示不同的級別內容;這樣一想的話,我們有可能就開始按照需要啪啪啪在Activity裡面定義好相關的方法,然後再加上一個AsyncTask用於後台http請求,沒錯這是常用的思維邏輯。但是我們現在好好地來分析一下就會發現,Activity裡面堆積的東西太多了,有沒有什麼辦法能夠給它瘦身呢?這個時候就輪到MVP閃亮登場了。請看下面的代碼:
public interface ITestMVP { void showButton1(); void showButton2(); void hiddenButton1(); void hiddenButton2(); }
首先我們定義一個接口,用於提供Activity裡面所需要用到的方法協議。然後我們需要在該Activity實現這個接口,類定義如下:
public class MyTestActivity extends Activity implements View.OnClickListener,ITestMVP { @Override public void showButton1() { } @Override public void showButton2() { } @Override public void hiddenButton1() { } @Override public void hiddenButton2() { } }
可以看到我們這個時候就應該在Activity裡面重寫如上四個方法,最後一步就應該將Presenter定義出來。其實Presenter的最主要的作用就是分離Activity UI層的操作和後台代碼的耦合性。請看Presenter代碼:
public class TestMvpPresenter { private ITestMVP iTestMVP; public TestMvpPresenter(ITestMVP iTestMVP) { this.iTestMVP = iTestMVP; } public void Button1Click(){ iTestMVP.showButton1(); iTestMVP.hiddenButton2(); } public void Button2Click(){ iTestMVP.showButton2(); iTestMVP.hiddenButton1(); } }
這個時候你會發現,其實所有的相關操作我們都已經提煉到Presenter裡面。這樣的話,我就不僅將UI和Model分開了,同時如果有其他相關的操作,我們還可以定義其他的Adapter。從而通過Presenter粘合多個處理邏輯的功能。同時如果我們在多個頁面之間是相同的處理邏輯的話,那麼就以為我們可以共用同一個Presenter。是不是很簡單呢?最後讓我們來看看,在Activity的onCreate方法裡面調用的代碼:
TestMvpPresenter testMvpPresenter=new TestMvpPresenter(this);
好了,今天就到這吧!如有不對,歡迎拍磚。
前面幾節,我們重點討論了自定義View的三板斧,這節我們來討論自定義ViewGroup,為什麼要自定義ViewGroup,其實就是為了更好的管理View。 自定義Vie
今天給大家說說安卓中類似這樣的引導頁面怎麼實現,我自己簡單的添加了個跳過按鈕方便跳轉到主界面,圖片跟小點圖片資源大家自己去網上找下面這個是我定義的一個activity_g
SimpleAdapter:可顯示文字加圖片activity_activitysimple.xml<?xml version=1.0 encoding=utf-8?
我們常常會用到上傳頭像,或者發帖子的時候選擇本地圖片上傳的功能.這個很常見今天因為app的需求我研究了下.現在分享下.其實不論是通過拍照還是從相冊選取都會用到Intent