Android框架之MVP实践简单万花筒
? Android官方早期中其實沒有所謂的MVC框架,在我還是新手的時候,一個完整的Android項目其實是很混亂的,傳統的MVC框架在Android上體現的不是很明顯。最近在看了MVP框架自己動手寫了以下發現MVP在Android中其實更像是傳統的MVC。
? MVP框架可以讓UI界面和數據分離,我們的應用至少可以分為3層,這樣使我們對這三層進行單獨的單元測試,MVP模式可以讓我們從Activity,Fragment等View角色中分離大部分代碼,使得每個類型的代碼量大幅度減少,職責單一,易于維護。
MVP中的三個角色
Presenter 交互中間人
Presenter主要作為溝通View和Model的橋梁,它從Model層檢索數據后,返回給View層,使得View和Model之間沒有耦合,也將業務邏輯從View角色中抽離出來
View-用戶界面
View通常指的Activity,Fragment,或者某個View控件,它含有一個Presenter(也可以擁有多個)成員變量。通常View需要實現一個邏輯接口,將View上的操作通過轉交給Presenter進行實現,最后,Presenter調用View邏輯接口將結果返回給View元素。
Model 數據的存儲
Model角色主要是提供數據的存儲功能,Presenter需要通過Model層存儲,獲取數據,Model就像一個數據倉庫,Model更想封裝了數據庫Dao或者網絡獲取數據的角色。
MVP框架的封裝
在使用MVP框架中,Presenter會持有Activity的強引用,在使用中經常會出現耗時操作,我們需要將Presenter中來綁定Activity Fragment的生命周期。我們采用的是弱引用和Activity fragment的生命周期來解決你這個問題,首先我們建立一個抽象Presenter
public abstract class BasePresenter<T> {protected Reference<T> viewRef;public void attachView(T view) {viewRef = new WeakReference<T>(view);}protected T getView() {return viewRef.get();}public boolean isViewAttached() {return viewRef != null && viewRef.get();}public void detachView() {if (viewRef != null) {viewRef.clear();viewRef = null;}} }
BasePresenter 有4個方法,分別是View建立關聯,解除關聯,判斷是否與View建立關聯,獲取View。View的類型通過泛型來傳遞,presenter持有一個View的弱引用。通常這個View的類型應該是一個實現了某個特定接口的Activity或者Fragment等類型。
public abstract class MVPBaseActivity<V, T extends BasePresenter<V>> extends Activity {protected T presenter;protected void onCreate(Bundle saveInstanceState) {super.onCreate();presenter = createPresenter();presenter.attachView((V) this);}protected void onDestroy() {super.onDestory();presenter.detachView();}protected abstract T createPresenter();}
MVPBaseActivity 里面有兩個泛型類型,一個是View接口類型,第二個是Presenter的具體類型。通過泛型參數,將一些通用的邏輯抽象到MVPBaseActivity里面,比如我們在抽象類中將Presenter 與View的邏輯直接完成,在子類繼承父類的時候只需要實現抽象方法createPresenter即可完成綁定,調用父類的super.onCreate() 完成綁定,調用父類的super.onDestory()則會解除綁定。
通過繼承MVPBaseActivity,實現抽象方法來完成MVP框架,代碼如下有刪減。
/*** A login screen that offers login via email/password.*/public class LoginActivity extends MVPBaseActivity<ILoginView, LoginPresenter> implements ILoginView, View.OnClickListener {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_login);ButterKnife.bind(this);initListener();initToolBar();}@Overrideprotected LoginPresenter createPresenter() {return new LoginPresenter(this);}@Overridepublic void loginFail() {showLoading(false);Toast.makeText(this, "loginFail", Toast.LENGTH_SHORT).show();}@Overridepublic void loginSuccess(User user) {showLoading(false);Toast.makeText(this, "loginSuccess", Toast.LENGTH_SHORT).show();setData(user);}}
總結
以上是生活随笔為你收集整理的Android框架之MVP实践简单万花筒的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用python绘制万花筒_Python实
- 下一篇: C#学习资料