摘要:就是,控制器,這里負(fù)責(zé)的是與之間的聯(lián)系操作。咱們的就是中的層,而且職責(zé)明確,只負(fù)責(zé)處理的部分。數(shù)據(jù)請求前有個數(shù)據(jù)請求后有個這就是層控制層和層的作用了。
這個項目簡單封裝了一個簡單的MVP設(shè)計框架,根據(jù)框架可以很容易的在你自己的項目中實現(xiàn) MVP 設(shè)計模式。繼承我封裝好的 BaseActivity,BaseFragmentActivity,BaseSwipeRefreshActivity,BaseFragment,BaseSwipseRefreshFragment 可以很好的實現(xiàn) MVP 模式的項目開發(fā)。
也許你知道 所謂的MVP 設(shè)計模式就是:
M就是Model ,這里主要負(fù)責(zé)的就是業(yè)務(wù)處理,數(shù)據(jù)的獲取,例如數(shù)據(jù)庫的讀寫,http的網(wǎng)絡(luò)數(shù)據(jù)的處理。 V就是View ,顧名思義視圖的意思,這里主要的任務(wù)就是處理各個界面ui控件的處理。 P就是Presenter ,控制器,這里負(fù)責(zé)的是Model與View之間的聯(lián)系操作。
其實簡單的用一句話描述就是:將View層抽象成view接口,將業(yè)務(wù)邏輯統(tǒng)統(tǒng)交給 Presenter 層去做。
也許還不太了解或是已經(jīng)了解的可以來看下面的 demo
下面的一個 activity 需要完成的功能是
(1)顯示初始化數(shù)據(jù) list data
(2)下拉刷新能加載新數(shù)據(jù)
(3)數(shù)據(jù)加載成功,或出錯做一些提示交互。
其實這些基本內(nèi)容是我們經(jīng)常和大量用到的一些場景。那來看看咱們怎么利用mvp模式來分層實現(xiàn):
首先繼承我封裝好了的 BaseSwipeRefreshActivity ,并且 自己 實現(xiàn) MainPresenter 類 和 IRefreshView 接口,那么 MainActivity 就可以實現(xiàn) 簡單的 mvp 設(shè)計模式了。
先分析 MVP 中 V層的實現(xiàn),及 MainActivity 的實現(xiàn):
public class MainActivity extends BaseSwipeRefreshActivityimplements IRefreshView { @Bind(R.id.toolbar) protected Toolbar mToolbar; @Bind(R.id.swipe_refresh_layout) protected SwipeRefreshLayout mSwipeRefreshLayout; @Bind(R.id.main_RecyclerView) RecyclerView main_RecyclerView; private DataAdapter mMianActivityAdapter; private List adapterList = new ArrayList (); @Override protected Toolbar getToolbar() { return mToolbar; } @Override protected SwipeRefreshLayout getSwipeRefreshLayout() { return mSwipeRefreshLayout; } @Override protected int getLayout() { return R.layout.activity_main; } @Override protected void initPresenter() { mPresenter = new MainPresenter(this, this); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initRecycleView(); } /** * 初始化請求數(shù)據(jù) */ @Override protected void intiData() { // 初始化數(shù)據(jù) mPresenter.initData(); // 可刷新狀態(tài)準(zhǔn)備好了 mPrepareRefresh = true; } /** * 刷新請求數(shù)據(jù) */ @Override protected void onRefreshStarted() { mPresenter.addMoreData(); } @Override public void showEmptyView() { SnackbarUtil.PrimarySnackbar(mContext,mToolbar,"請求數(shù)據(jù)為空"); } @Override public void showErrorView(Throwable throwable) { SnackbarUtil.PrimarySnackbar(mContext,mToolbar,"請求數(shù)據(jù)出錯"); } @Override public void hasNoMoreData() { SnackbarUtil.PrimarySnackbar(mContext,mToolbar,"無更多數(shù)據(jù)"); } /** * 初始化填充數(shù)據(jù) * @param mData */ @Override public void fillData(List mData) { mMianActivityAdapter.insertedAllItem(mData); } /** * 加載更多數(shù)據(jù) * @param mData */ @Override public void appendMoreDataToView(List mData) { mMianActivityAdapter.appendMoreItem(mData); } @Override protected int getMenuRes() { return R.menu.mian_menu; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); switch (id){ case R.id.menu_1: SnackbarUtil.PrimarySnackbar(mContext,mToolbar,"FragmentActivity"); Intent intent = new Intent(MainActivity.this,FragmentActivity.class); startActivity(intent); break; } return super.onOptionsItemSelected(item); } private void initRecycleView() { final LinearLayoutManager layoutManager = new LinearLayoutManager(this); main_RecyclerView.setLayoutManager(layoutManager); mMianActivityAdapter = new DataAdapter(mContext,adapterList); main_RecyclerView.setAdapter(mMianActivityAdapter); } }
代碼看的有點多,不過相對那種把什么功能都放在 activity 來講已經(jīng)很少了,而且看上面代碼結(jié)構(gòu)清晰,功能明確,職責(zé)分明,耦合度低,很適合擴(kuò)展。 ^-^ ///
其實上面的 activity 主要負(fù)責(zé)
(1) view 的 一些初始化,如:
@Bind(R.id.toolbar) protected Toolbar mToolbar; @Bind(R.id.swipe_refresh_layout) protected SwipeRefreshLayout mSwipeRefreshLayout; @Bind(R.id.main_RecyclerView) RecyclerView main_RecyclerView;
private void initRecycleView() { final LinearLayoutManager layoutManager = new LinearLayoutManager(this); main_RecyclerView.setLayoutManager(layoutManager); mMianActivityAdapter = new DataAdapter(mContext,adapterList); main_RecyclerView.setAdapter(mMianActivityAdapter); }
(2)view 的一些更新,如:
@Override public void showEmptyView() { SnackbarUtil.PrimarySnackbar(mContext,mToolbar,"請求數(shù)據(jù)為空"); }
/** * 初始化填充數(shù)據(jù) * @param mData */ @Override public void fillData(List mData) { mMianActivityAdapter.insertedAllItem(mData); }
而數(shù)據(jù)的請求部分只有單單兩句:
mPresenter.initData(); mPresenter.addMoreData();
那么再來看一眼 什么是 MVP 設(shè)計模式:
M就是Model ,這里主要負(fù)責(zé)的就是業(yè)務(wù)處理,數(shù)據(jù)的獲取,例如數(shù)據(jù)庫的讀寫,http的網(wǎng)絡(luò)數(shù)據(jù)的處理。 V就是View ,顧名思義視圖的意思,這里主要的任務(wù)就是處理各個界面ui控件的處理。 P就是Presenter ,控制器,這里負(fù)責(zé)的是Model與View之間的聯(lián)系操作。
咱們的 activity 就是 mvp 中的 v 層 ,而且職責(zé)明確,只負(fù)責(zé) ui 處理的 部分。
其他都交給了 Presenter 去做, 那咱們接下來再來分析分析 Presenter 是怎么做到 操作
model 和 view 之間的聯(lián)系的。
分析 MVP 中 P 層的實現(xiàn) 及 MainPresenter:
先看 activity 有繼承 IRefreshView 這個接口
public class MainActivity extends BaseSwipeRefreshActivityimplements IRefreshView { }
那么咱們在 Presenter 取得數(shù)據(jù) 并調(diào)用 IRefreshView 接口,并在 MainActivity 實現(xiàn) 該接口的方法,這不就是:
P就是Presenter ,控制器,這里負(fù)責(zé)的是Model與View之間的聯(lián)系操作。
具體看一下 MainPresenter 類:
public class MainPresenter extends BasePresenter{ public MainPresenter(Activity context, IRefreshView view) { super(context, view); } public void initData(){ mView.showRefresh(); List strList = new ArrayList (); for (int i=0;i<10;i++){ strList.add(""+i); } mView.getDataFinish(); mView.fillData(strList); } public void addMoreData(){ mView.showRefresh(); List strList = new ArrayList (); for (int i=0;i<10;i++){ strList.add("more_"+i); } mView.getDataFinish(); mView.appendMoreDataToView(strList); } }
看
mPresenter.initData(); mPresenter.addMoreData();
就是 MainPresenter 類 里面的 方法 ,及Presenter 層,其實請求數(shù)據(jù)應(yīng)該是 Model 層的,但咱們的示例代碼請求模擬數(shù)據(jù)太簡單的,就沒有再弄個 類(及Model 層)來封裝。
數(shù)據(jù)請求前有個:
mView.showRefresh();
數(shù)據(jù)請求后有個:
mView.getDataFinish();
這就是 persenter 層控制 model 層和 view 層的 作用了。
接下來看一下 抽象 view :
public interface IRefreshViewextends ISwipeRefreshView { void fillData(List mData); void appendMoreDataToView(List mData); void hasNoMoreData(); }
public interface ISwipeRefreshView extends IBaseView { void getDataFinish(); void showEmptyView(); void showErrorView(Throwable throwable); void showRefresh(); void hideRefresh(); }
好了,看到這里不知道明白了 MVP 設(shè)計模式的原理和好處了沒。大概終結(jié)一下:
activity 或 fragment 或是 視圖層要做的一些數(shù)據(jù)請求從而跟新 視圖,可以將中間這些操作交給 persenter 去做,視圖只負(fù)責(zé) ui 的處理,而 persenter 需要 去操作 modle 得到數(shù)據(jù)后通知跟新視圖,怎么通知呢,就是 利用 接口回調(diào) 的形式 更新視圖。也就是這開頭講的這么一句話:
將View層抽象成view接口,將業(yè)務(wù)邏輯統(tǒng)統(tǒng)交給 Presenter 層去做。
建議可以下載源碼結(jié)合本片介紹,會有助于理解,本片博只是簡單介紹一下流程,源碼做了一點封裝,可以到我的github clone ,歡迎stars ,此項目會繼續(xù)更新維護(hù)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/66210.html
摘要:目前它還未正式發(fā)布。理解系列一是谷歌在發(fā)布一套幫助開發(fā)者解決架構(gòu)設(shè)計的方案。但最近還是推出了一份關(guān)于應(yīng)用架構(gòu)的實踐指南,并給出了相當(dāng)詳盡的步驟和一些指導(dǎo)建議。 MVP+Retrofit+Rxjava在項目中實戰(zhàn)解析 文章目標(biāo) MVP在android中的原理解析 MVP+Retrofit+Rxjava在項目中實戰(zhàn)解析 架構(gòu)經(jīng)驗分享 MVP簡單介紹 先說說MVC分層: View:對應(yīng)于布局...
摘要:音樂團(tuán)隊分享數(shù)據(jù)綁定運(yùn)行機(jī)制分析一個項目搞定所有主流架構(gòu)單元測試一個項目搞定所有主流架構(gòu)系列的第二個項目。代碼開源,展示了的用法,以及如何使用進(jìn)行測試,還有用框架對的進(jìn)行單元測試。 Android 常用三方框架的學(xué)習(xí) Android 常用三方框架的學(xué)習(xí) likfe/eventbus3-intellij-plugin AS 最新可用 eventbus3 插件,歡迎品嘗 簡單的 MVP 模...
閱讀 1997·2021-11-24 09:39
閱讀 3420·2021-09-22 14:58
閱讀 1229·2019-08-30 15:54
閱讀 3387·2019-08-29 11:33
閱讀 1854·2019-08-26 13:54
閱讀 1699·2019-08-26 13:35
閱讀 2542·2019-08-23 18:14
閱讀 837·2019-08-23 17:04