码迷,mamicode.com
首页 > 移动开发 > 详细

Android中的MVP架构

时间:2015-11-27 17:28:43      阅读:273      评论:0      收藏:0      [点我收藏+]

标签:

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);
}

 

Android中的MVP架构

标签:

原文地址:http://www.cnblogs.com/allin1579/p/5000823.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!