Android開發之初識MVP模式
各位親愛的小夥伴,有沒有想我啊,我胡漢wing又回來了。
很長一段時間沒有更新部落格。。原因是。。從離職回到學校以後,一直在享受最後的學生時光(打遊戲).. 遊戲固然很爽,但是覺得實在很荒廢,於是半夜詐個屍..學習一下流行的MVP模式,就拿我剛學Android的項目“wifi密碼讀取器”開刀吧。。以前的代碼很爛,所以來個徹底的重構…
MVP模式
mvp模式的介紹網上有很多,這裡在簡述一下:
MVP即 Model View Presenter, 他與MVC的區別在於在MVP裡面View和Model不直接進行互動,完全交給Presenter。這樣Activity就真實的成為了一個View,邏輯任務交給Presenter處理。不再是以前Activity即充當View又沖當Controller的情況。
簡單來說如:
學習編寫
簡單的瞭解了一下MVP以後,開始拿“wifi密碼讀取器”開刀(wifi密碼讀取器是一款能夠讀取手機wifi密碼的應用,配合萬能鑰匙使用更贊哦。。)
明確需求
進行第一部分的編寫實現,需求如:
基本就是:
+ 初始化listview的內容
+ 為FloatingActionButton添加監聽<喎?http://www.bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxoMSBpZD0="代碼的編寫">代碼的編寫首先,來一個實體Bean
public class WifiBean { private String mSsid = ""; private String mComment = ""; private String mKey = ""; public String getmSsid() { return mSsid; } public void setmSsid(String mSsid) { this.mSsid = mSsid; } public String getmComment() { return mComment; } public void setmComment(String mComment) { this.mComment = mComment; } public String getmKey() { return mKey; } public void setmKey(String mKey) { this.mKey = mKey; }}
Model層,主要用於資料的擷取或者其他增刪操作
public interface IWifiModel { ArrayList getWifis(); void addWifi(WifiBean wifiBean); void delWifi(WifiBean wifiBean);}public class WifiModelImpl implements IWifiModel { @Override //這裡類比實現從手機讀取出wifi的密碼 public ArrayList getWifis() { ArrayList list = new ArrayList<>(); for(int i = 0 ;i<5;i++) { list.add(new WifiBean()); } return list; } @Override public void addWifi(WifiBean wifiBean) { } @Override public void delWifi(WifiBean wifiBean) { }}
View層,主要表明view要做哪些事情
public interface IWifiView { void setListViewData(ArrayList list); void showSnackbar(View view);}
因為Activity即為View,所以讓Activity實現這個介面,並且實現view的方法。
public class MainActivity extends AppCompatActivity implements IWifiView{ private ListView mListView; private WifiAdapter mWifiAdapter; //包含一個presenter private WifiPresenterImpl mWifiPresenter; private Toolbar mToolbar; private FloatingActionButton mFAB; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //initViews()方法仍然不變 initViews(); //初始化一個Presenter mWifiPresenter = new WifiPresenterImpl(this); //將需要初始化的東西交由Presenter處理 mWifiPresenter.onCreate(); } private void initViews() { mToolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(mToolbar); mListView = (ListView) findViewById(R.id.listView); mFAB = (FloatingActionButton) findViewById(R.id.fab); mFAB.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //處理使用者的事件 mWifiPresenter.showSnackbar(view); } }); } //實現view介面的方法,為listview設定資料 @Override public void setListViewData(ArrayList list) { mWifiAdapter = new WifiAdapter(this,list); mListView.setAdapter(mWifiAdapter); } //實現view介面的方法,彈出Snackbar @Override public void showSnackbar(View view) { Snackbar.make(view, "側滑有驚喜哦!", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); }}
最後是Presenter ,用來處理Model和View
public interface IWifiPresenter { //交付過來的onCreate void onCreate();}public class WifiPresenterImpl implements IWifiPresenter{ private IWifiView mWifiView; private IWifiModel mWifiModel; public WifiPresenterImpl(IWifiView wifiView) { //傳入View mWifiView = wifiView; //初始化Model mWifiModel = new WifiModelImpl(); } //私人方法,在onCreate裡調用,用來初始化listview資料,presenter操作model和view private void setWifiDatas() { mWifiView.setListViewData(mWifiModel.getWifis()); } //交付過來的onCreate()周期 @Override public void onCreate() { setWifiDatas(); } //讓Snackbar顯示 public void showSnackbar(View view) { mWifiView.showSnackbar(view); }}
好了,基本上簡單的展示寫完了,可以看到思路邏輯非常的清晰。這也是我對MVP模式的一點理解和應用,光是這一點內容,就理解了好久。。。。如果有什麼錯誤的地方,求各位拍磚,一起討論。
歡迎關注我的部落格,蟹蟹!