标签:
Android应用的MVC架构,Activity往往充当了View和Control双重角色,造成代码耦合性较强。怎样将View和Control解耦呢,可以使用MVP架构(Model、Control、Prestener)将Activity的View和Control彻底分离,不说废话了直接上代码吧!
github: https://github.com/Allin1579/Allin-android
以Activity为例,Fragment的原理相同:
View:我们将Activity看作一个单纯的View
package com.allin.android.activity; import com.allin.android.presenter.BasePrestener; import android.app.Activity; import android.os.Bundle; /** * MVP架构中Activity的基类,主要用于与Prestener建立关联并管理生命周期 * @author Allin * 2015.11.24 * @param <V> BaseActivity子类需继承的View接口,该接口声明了Activity的各种视图操作逻辑, MVP中的V * @param <P> BasePrestener子类, MVP中的P */ public abstract class BaseActivity<V, P extends BasePrestener<V>> extends Activity { protected P mPrestener; //持有一个Prestener对象的引用,用来调用Prestener中的数据逻辑 @SuppressWarnings("unchecked") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mPrestener = createPrestener(); mPrestener.attachView((V)this); } @Override protected void onDestroy() { super.onDestroy(); mPrestener.detachView(); } protected abstract P createPrestener(); //mPrestener对象延迟到子类生产 }
Prestener:中介者用来处理数据逻辑和View中视图逻辑的流程控制
package com.allin.android.presenter; import java.lang.ref.Reference; import java.lang.ref.WeakReference; /** * MVP架构中Prestener的基类,主要用于与View建立关联并管理生命周期 * @author Allin * 2015.11.24 * @param <V> View接口 */ public abstract class BasePrestener<V> { protected Reference<V> mViewRef; //持有一个V的引用,用来调用Activity或Fragment中的视图逻辑 public void attachView(V view){ mViewRef = new WeakReference<V>(view); //此处使用弱引用,防止因Activity或Fragment异常关闭造成内存泄露 } protected V getView(){ return mViewRef.get(); } public boolean isViewAttached(){ return mViewRef != null && mViewRef.get() != null; } public void detachView(){ if(mViewRef != null){ mViewRef.clear(); mViewRef = null; } } }
至此,V和C已经完全解耦。
为了避免Prestener臃肿,我们可以将具体逻辑进一步分离,以联网Api为例:
package com.allin.android.api; import java.util.Map; /**Api基类 * @author Allin * 2015.11.24 */ class BaseApi { /** * http get请求 * @param url * @param params * @param callback 将网络获取的数据回调给调用者 */ public void httpGet(final String url, final Map<?, ?> params, final ApiCallback callback){ // TODO Auto-generated method stub } /** * http post请求 * @param url * @param params * @param callback 将网络获取的数据回调给调用者 */ public void httpPost(final String url, final Map<?, ?> params, final ApiCallback callback){ // TODO Auto-generated method stub } }
Api回调接口:
package com.allin.android.api; /** * ApiCallback * @author Allin * 2015.11.24 */ public interface ApiCallback { /** * 网络请求成功的回调 * @param result */ <T> void onSucceed(T result); /** * 网络请求失败的回调 * @param msg */ void onFailed(String msg); }
标签:
原文地址:http://www.cnblogs.com/allin1579/p/5000823.html