Android中的MVP架构

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);
}
时间: 2024-12-28 14:09:25

Android中的MVP架构的相关文章

Android中的MVP架构初探

说来惭愧,MVP的架构模式已经在Android领域出现一两年了,但是到今天自己才开始Android领域中的MVP架构征程.闲话不多说,开始吧! 一.架构演变概述 我记得我找第一份工作时,面试官问我"android是否属于MVC架构模式,简述一下".确实,Android的整体设计结构就是MVC的设计模式,在J2EE的开发中,使用的也是MVC模式,MVC模式是一个经典,经历了几十年的考验.Android项目中的MVC架构: View:是应用程序中处理数据显示的部分,对应于layout文件下

Android开发中的MVP架构(转)

写在前面,本博客来源于公众号文章:http://mp.weixin.qq.com/s?__biz=MzA3MDMyMjkzNg==&mid=402435540&idx=1&sn=1cd10bd9efaac7083575367a8b4af52f&scene=1&srcid=0910ARzPpBvVYPI1NDBZnixa#wechat_redirect 最近越来越多的人开始谈论架构.我周围的同事和工程师也是如此.尽管我还不是特别深入理解MVP和DDD,但是我们的新项目

浅谈Android中的MVP

转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/51745798 本文出自:[顾林海的博客] 前言 为什么使用MVP,网上有很多说法,最主要就是减轻了Activity的责任,相比于MVC中的Activity承担的责任太多,因此有必要讲讲MVP. MVP入门 在MVC框架中,View是可以直接读取Model模型中的数据的,Model模型数据发生改变是会通知View数据显示发生相应的改变.而在MVP中Model和View之

如何使用MVP架构Android应用项目

目录 MVP简介 MVP结构 MVP与MVC区别 实战演习 正文 1.MVP简介 相信大家对MVC都是比较熟悉了:M-Model-模型.V-View-视图.C-Controller-控制器,MVP作为MVC的演化版本,那么类似的MVP所对应的意义:M-Model-模型.V-View-视图.P-Presenter-表示器.从MVC和MVP两者结合来看,Controlller/Presenter在MVC/MVP中都起着逻辑控制处理的角色,起着控制各业务流程的作用.而MVP与MVC最不同的一点是M与V

ReadHub项目Kotlin版开发指南(三、MVP架构)

ReadHub项目Kotlin版转换指南(一.环境搭建) ReadHub项目Kotlin版转换指南(二.数据库和网络请求) ReadHub项目Kotlin版转换指南(三.MVP架构) Android 开发中的 MVP 架构相信大家都已经熟悉,不熟悉的请右转 Google,ReadHub 项目从 Java 转换成 Kotlin 过程中,我们需要一套新的架构方式来实现(Kotlin 项目中没有使用 dagger2). base 为 MVP 架构的基础部分,user 为其具体使用过程. base Ba

Android中关于Handler的若干思考

在之前的博文中,讲过一些和Handler有关的知识,例如: Android 多线程----AsyncTask异步任务详解 Android多线程----异步消息处理机制之Handler详解 今天再把Handler的知识回顾总结一下. 本文包括与Handler有关的以下问题: (1)Handler的作用 (2)为什么Android中要设计为只能在UI线程中去更新UI呢? (3)Handler的两个异常 (4)Handler.Looper MessageQueue之间的关系(源码角度) (5)跟线程相

MVP架构实践

一.MVP理论简介 1.为何要在android中引入MVP ??在Android项目中,Activity和Fragment占据了大部分的开发工作.而MVP设计模式可以优化Activity和Fragment的代码. ??相信很多人阅读代码的时候,都是从Activity开始的,对着一个1000+行代码的Activity,看了都觉得难受. ??使用MVP之后,Activity就能瘦身许多了,基本上只有FindView.SetListener以及Init的代码.其他的就是对Presenter的调用,还有

介绍Model-View-Presenter在Android中的应用

这篇文章是我学习MVP模式时翻译的,原文是Konstantin Mikheev所写,传送门. 因英语水平有限,翻译的很生硬,基本靠Google,请见谅.以下是译文. 这篇文章我会通过一个最简单的例子去一步步介绍MVP模式在Android中的最佳实践.同时我也会介绍一个使MVP模式在Android开发中变简单的library. 简单?怎么才能从中获益呢? 什么是MVP View层是用来显示数据和相应数据操作的.在Android中,它可能是Activity,Fragment,View或者Dialog

MVP架构在xamarin android中的简单使用

好几个月没写文章了,使用xamarin android也快接近两年,还有一个月职业生涯就到两个年了,从刚出来啥也不会了,到现在回头看这个项目,真jb操蛋(真辛苦了实施的人了,无数次吐槽怎么这么丑),怪自己太年轻了,还好是给指定行业的人使用. 重新学习思考之后,再看自己在项目中的某些实现的代码,的确不尽人意,甚至想骂自己. 项目经常改,改来该去,代码一直增加,一个fragment也没什么功能,接近1000行的代码,用region括起来,开看起来还挺整齐的,找的时候就凉了.究其原因,没有一种模式,所