Android开发中MVP模式浅析

目前为止,MVP的使用还没有一个标准,在此先记录一下目前学习到的一些Android中使用MVP的知识。

按传统的方式开发,经常会使Activity中混杂着UI交互,业务逻辑等流程。而MVP模式能巧妙的解决这个问题。先直接上一个小例子吧。

/**
 * 定义一个对UI组件进行操作的接口,让Activity实现这个接口
 * @author Quinn
 * @date 2015-5-9
 */
public interface LoginView {
    public void showProgress();

    public void hideProgress();

    public void setUsernameError();

    public void setPasswordError();

    public void navigateToHome();
}
/**
 * Activity需要实现View接口,并且持有一个Presenter对象,将逻辑处理都转到Presenter
 * @author Quinn
 * @date 2015-5-9
 */
public class LoginActivity extends Activity implements LoginView,
		View.OnClickListener {

	private ProgressBar progressBar;
	private EditText username;
	private EditText password;
	private LoginPresenter presenter;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_login);

		progressBar = (ProgressBar) findViewById(R.id.progress);
		username = (EditText) findViewById(R.id.username);
		password = (EditText) findViewById(R.id.password);
		findViewById(R.id.button).setOnClickListener(this);

		presenter = new LoginPresenterImpl(this);
	}

	@Override
	public void showProgress() {
		progressBar.setVisibility(View.VISIBLE);
	}

	@Override
	public void hideProgress() {
		progressBar.setVisibility(View.GONE);
	}

	@Override
	public void setUsernameError() {
		username.setError(getString(R.string.username_error));
	}

	@Override
	public void setPasswordError() {
		password.setError(getString(R.string.password_error));
	}

	@Override
	public void navigateToHome() {
		startActivity(new Intent(this, MainActivity.class));
		finish();
	}

	@Override
	public void onClick(View v) {
		presenter.validateCredentials(username.getText().toString(), password
				.getText().toString());
	}
}
/**
 * Presenter接口,声明了登陆的逻辑处理接口
 * @author Quinn
 * @date 2015-5-9
 */
public interface LoginPresenter {
    public void validateCredentials(String username, String password);
}
/**
 * Presenter的具体实现,持有View和Interator的引用,处理UI响应,数据处理等
 * 其中Interactor代表了Model,可以通过不同的Interactor处理各个Use case
 * @author Quinn
 * @date 2015-5-9
 */
public class LoginPresenterImpl implements LoginPresenter,
		OnLoginFinishedListener {

	private LoginView loginView;
	private LoginInteractor loginInteractor;

	public LoginPresenterImpl(LoginView loginView) {
		this.loginView = loginView;
		this.loginInteractor = new LoginInteractorImpl();
	}

	@Override
	public void validateCredentials(String username, String password) {
		loginView.showProgress();
		loginInteractor.login(username, password, this);
	}

	@Override
	public void onUsernameError() {
		loginView.setUsernameError();
		loginView.hideProgress();
	}

	@Override
	public void onPasswordError() {
		loginView.setPasswordError();
		loginView.hideProgress();
	}

	@Override
	public void onSuccess() {
		loginView.navigateToHome();
	}
}
/**
 * 处理登陆的接口
 * @author Quinn
 * @date 2015-5-9
 */
public interface LoginInteractor {
    public void login(String username, String password, OnLoginFinishedListener listener);
}

/**
 * 登陆Interactor的实现,在Presenter中持有它的引用
 * @author Quinn
 * @date 2015-5-9
 */
public class LoginInteractorImpl implements LoginInteractor {

    @Override
    public void login(final String username, final String password, final OnLoginFinishedListener listener) {
        // Mock login. I'm creating a handler to delay the answer a couple of seconds
        new Handler().postDelayed(new Runnable() {
            @Override public void run() {
                boolean error = false;
                if (TextUtils.isEmpty(username)){
                    listener.onUsernameError();
                    error = true;
                }
                if (TextUtils.isEmpty(password)){
                    listener.onPasswordError();
                    error = true;
                }
                if (!error){
                    listener.onSuccess();
                }
            }
        }, 2000);
    }
}
/**
 * 登陆结果回调接口
 * @author Quinn
 * @date 2015-5-9
 */
public interface OnLoginFinishedListener {

    public void onUsernameError();

    public void onPasswordError();

    public void onSuccess();
}

稍微分析一下上面得代码接口。

View层:是图层,主要是定义一个View接口,声明各种处理UI组件的方法,然后由Activity实现,但是最后真正的调用时在Presenter中,因为在Activity中定义Presenter时将View作为构造函数的参数传递给了Presenter。

Presenter层:业务层,响应UI层,数据层,逻辑处理,持有Interactor引用。

Model/Interactor层:这里的Interactor就是Model层,它定义具体的行为接口供Presenter调用,可以实现不同的Interactor处理不同的Use case。比如数据读取,数据存储,网络请求等等操作。

参考资料:

http://antonioleiva.com/mvp-android/

https://github.com/antoniolg/androidmvp

时间: 2024-10-10 09:26:21

Android开发中MVP模式浅析的相关文章

Android开发学习--MVP模式入门

1.模型与视图完全分离,我们可以修改视图而不影响模型2.可以更高效地使用模型,因为所有的交互都发生在一个地方--Presenter内部3.我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑.这个特性非常的有用,因为视图的变化总是比模型的变化频繁.4.如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试) 下面示例一个小案例: 项目架构: 首先bean层: User.java public class User { privat

MVP模式在Android开发中的应用

一.MVP介绍 随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责.为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数据的可视化以及与用户的交互.同一时候让Model仅仅关系数据的处理.基于MVC概念的MVP(Model-View-Presenter)模式应运而生. 在MVP模式里通常包括4个要素: (1)View:负责绘制UI元素.与用户进行交互(在Android中体现为Activity); (2)View interface:须要View实现的接口,V

MVP模式在Android开发中的最佳实践

这篇文章拖了好久了,一直存在草稿箱里没有继续写,趁今天有空,撸撸完. 回想一下,你刚刚学习Android的时候,总会看到一些书上写着,Android使用的是MVC模式,Activity就是一个Controller,或许那个时候,你没有什么深刻的体会.随着经验的积累.你发现,Activity既是Controller,掌管着许许多多的业务逻辑,同时它也作为View的一部分,控制着视图层的显示.久而久之,这个Controller便显得过于重,职责不再那么单一. 于是,再后来,为了使Activity的职

Android开发中的MVP架构(转)

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

Builder模式详解及其在Android开发中的应用

一.引言 在Android开发中,采用Builder模式的代码随处可见,比如说Android系统对话框AlertDialog的使用或者是Android中的通知栏(Notification)的使用,又比如说在一些常用的第三方库中也随处可见其踪迹,比如说一些常用的网络请求库如OkHttp或者是retrofit,又或者是图片加载库Glide中也不缺乏它的应用. 为什么Builder模式在Android或是Java开发中这么火呢?因为它相较于构造函数或者是Get/Set方法,它的灵活性和封装性上都比较有

Android开发中无处不在的设计模式——原型模式

不知不觉这个系列已经写了三篇了,其实很早之前就想写设计模式了,只不过怕自己误人子弟没有提笔去写.后来在实际开发中,发现设计模式可以让一个开发人员融会贯通所学的知识,为了进一步巩固自己,就写下了这一些列文章.前面介绍了三个模式. Android开发中无处不在的设计模式--单例模式 Android开发中无处不在的设计模式--Builder模式 Android开发中无处不在的设计模式--观察者模式 本篇文章介绍的模式其实很简单,即原型模式,按照惯例,先看定义. 用原型实例指定创建对象的种类,并通过拷贝

Android开发中无处不在的设计模式——策略模式

这个系列停更了好久了,差不多可以重新拿起来更一篇了,这篇文章主要介绍策略模式.在这之前,先温习一下前面介绍的4种模式. 设计模式很重要! 设计模式很重要! 设计模式很重要! 重要的事说三遍!!! Android开发中无处不在的设计模式--单例模式 Android开发中无处不在的设计模式--Builder模式 Android开发中无处不在的设计模式--观察者模式 Android开发中无处不在的设计模式--原型模式 接着看下策略模式的定义 策略模式定义了一些列的算法,并将每一个算法封装起来,而且使它

Android开发中无处不在的设计模式——动态代理模式

继续更新设计模式系列,写这个模式的主要原因是最近看到了动态代理的代码. 先来回顾一下前5个模式: - Android开发中无处不在的设计模式--单例模式 - Android开发中无处不在的设计模式--Builder模式 - Android开发中无处不在的设计模式--观察者模式 - Android开发中无处不在的设计模式--原型模式 - Android开发中无处不在的设计模式--策略模式 动态代理模式在Java WEB中的应用简直是随处可见,尤其在Spring框架中大量的用到了动态代理:算是最重要

Android开发之动画效果浅析

Android开发之动画效果浅析 请尊重他人的劳动成果,转载请注明出处:Android开发之动画效果浅析 程序运行效果图: Android动画主要包含补间动画(Tween)View Animation.帧动画(Frame)Drawable Animation.以及属性动画Property Animation.下面依次介绍一下各个动画. 1.   补间动画(Tween) Tween动画,通过对View 的内容进行一系列的图形变换 (包括平移.缩放.旋转.改变透明度)来实现动画效果.动画效果的定义可