MVP应用在android app上
使用MVP模式来解耦activity中业务代码和界面代码。在activity中,将其中的业务抽象到presenter层;将其中的界面代码抽象到View层。
MVP模式:

一个软件被划分成三层,View层,Presenter层,Model层。
View层的职责是展示界面,界面绘制。
Presenter层的职责是,实现各种业务逻辑,业务逻辑的代码都放在这一层。
Model层的职责是数据的存储,修改,获取。
各层之间的交互:
View层和Presenter层之间的通信是双向的。
Presenter层和Model层之间的通信是双向的。
View层不与Model层发生交互。
MVP模式应用到Android app:
View层:activity,fragment,其中的界面展示,就是View层的内容。
Presenter层:点击一个按钮要执行的业务逻辑,则是由Presenter层来实现。也就是说,Presenter层抽象,提取出activity,fragment中的业务逻辑。这样就可以将业务逻辑代码与界面展示代码解耦掉。可以重用业务逻辑。
Model层:这一层,则是数据存取,数据修改层。配置信息,获取数据源的数据,获取服务器数据,获取数据库的数据,更新数据库的数据,这些实现代码都由这一层来提供。
MVP模式应用到Android app的一个例子分析:
Login这个模块,把View层和presenter层放在了一起:

package com.antonioleiva.mvpexample.app.Login;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ProgressBar;
import com.antonioleiva.mvpexample.app.R;
import com.antonioleiva.mvpexample.app.main.MainActivity;
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());
    }
}
this.loginView = loginView;
this.loginInteractor = new LoginInteractorImpl();
}
loginView.setUsernameError();
loginView.hideProgress();
}
loginView.setPasswordError();
loginView.hideProgress();
}
loginView.navigateToHome();
}
public void validateCredentials(String username, String password);
}
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();
    }
}
public void onUsernameError();
public void onPasswordError();
public void onSuccess();
}
@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);
    }
}  
loginView.showProgress();
loginInteractor.login(username, password, this);
}
public void showProgress();
public void hideProgress();
public void setUsernameError();
public void setPasswordError();
public void navigateToHome();
}

public void showProgress();
public void hideProgress();
public void setItems(List<String> items);
public void showMessage(String message);
}
private ListView listView;
    private ProgressBar progressBar;
    private MainPresenter presenter;
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = (ListView) findViewById(R.id.list);
        listView.setOnItemClickListener(this);
        progressBar = (ProgressBar) findViewById(R.id.progress);
        presenter = new MainPresenterImpl(this);
}
@Override protected void onResume() {
        super.onResume();
        presenter.onResume();
    }
@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
@Override public void showProgress() {
        progressBar.setVisibility(View.VISIBLE);
        listView.setVisibility(View.INVISIBLE);
    }
@Override public void hideProgress() {
        progressBar.setVisibility(View.INVISIBLE);
        listView.setVisibility(View.VISIBLE);
    }
@Override public void setItems(List<String> items) {
        listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items));
    }
@Override public void showMessage(String message) {
        Toast.makeText(this, message, Toast.LENGTH_LONG).show();
    }
@Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        presenter.onItemClicked(position);
    }
}
public void onResume();
public void onItemClicked(int position);
}
private MainView mainView;
    private FindItemsInteractor findItemsInteractor;
public MainPresenterImpl(MainView mainView) {
        this.mainView = mainView;
        findItemsInteractor = new FindItemsInteractorImpl();
    }
@Override public void onResume() {
        mainView.showProgress();
        findItemsInteractor.findItems(this);
    }
@Override public void onItemClicked(int position) {
        mainView.showMessage(String.format("Position %d clicked", position + 1));
    }
@Override public void onFinished(List<String> items) {
        mainView.setItems(items);
        mainView.hideProgress();
    }
}
MVP应用在android app上的更多相关文章
- 将TensorFlow训练好的模型迁移到Android APP上(TensorFlowLite)
		
转自:https://blog.csdn.net/u012328159/article/details/81101074 https://blog.csdn.net/masa_fish/article ...
 - Android App的架构设计:从VM、MVC、MVP到MVVM
		
随着Android应用开发规模的扩大,客户端业务逻辑也越来越复杂,已然不是简单的数据展示了.如同后端开发遇到瓶颈时采用的组件拆分思想,客户端也需要进行架构设计,拆分视图和数据,解除模块之间的耦合,提高 ...
 - ANDROID – TOOLBAR 上的 NAVIGATION DRAWER(转)
		
在 Material Design 釋出後,Google 也開始陸續更新了 Google app 的介面,讓大家有個範例可以看.而過去大力推動的 actionbar 自然而然也成了眾開發者觀注的部份: ...
 - Android App的设计架构:MVC,MVP,MVVM与架构经验谈
		
相关:http://www.cnblogs.com/wytiger/p/5996876.html 和MVC框架模式一样,Model模型处理数据代码不变在Android的App开发中,很多人经常会头疼于 ...
 - Android App的设计架构:MVC,MVP,MVVM与架构AAAAA
		
1. 架构设计的目的1.1 通过设计使程序模块化,做到模块内部的高聚合和模块之间的低耦合.1.2 这样做的好处是使得程序在开发的过程中,开发人员只需要专注于一点,提高程序开发的效率,并且更容易进行后续 ...
 - android app崩溃日志收集以及上传
		
源代码获取请到github:https://github.com/DrJia/AndroidLogCollector 已经做成sdk的形式,源代码已公开,源代码看不懂的请自行google. 假设想定制 ...
 - Android 开发 关于APP无法安装到Android模拟器上的问题
		
我们在创建一个app后,打算安装到Android模拟器上.可能会出现无法安装,或者提示已经安装无法卸载的问题.这个时候需要添加兼容CPU. 选择 build.gradle 文件打开添加如下代码: an ...
 - Android APP架构设计——MVP的使用示例
		
0. 前言 为了更好地进行移动端架构设计,我们最常用的就是MVC.MVP和MVVM,作为三个最耳熟能详的三大架构,应用可谓非常广泛.对于这三种架构设计以及优缺点已经在Android APP架构设计-- ...
 - [转]Android App整体架构设计的思考
		
1. 架构设计的目的 对程序进行架构设计的原因,归根到底是为了提高生产力.通过设计使程序模块化,做到模块内部的高聚合和模块之间的低耦合.这样做的好处是使得程序在开发的过程中,开发人员只需要专注于一点, ...
 
随机推荐
- Thunder团队第六周 - Scrum会议4
			
Scrum会议4 小组名称:Thunder 项目名称:i阅app Scrum Master:胡佑蓉 工作照片: 苗威同学在拍照,所以不在照片内. 参会成员: 王航:http://www.cnblogs ...
 - c# dll问题
			
问题描述: dll完全拷贝另一个程序,可是报缺少引用程序集之类的错误. 解决办法: 有可能是.net版本造成的错误.一般常见在3.5升到4之后,存在很多容差.
 - SQL 单表分页存储过程和单表多字段排序和任意字段分页存储过程
			
第一种:单表多字段排序分页存储过程 --支持单表多字段查询,多字段排序 create PROCEDURE [dbo].[UP_GetByPageFiledOrder] ( ), --表 ...
 - asp.net mvc4使用log4.net 日志功能
			
对于网站来讲,不能把异常信息显示给用户,异常信息只能记录到日志,出了问题把日志文件发给开发人员,就能知道问题所在. 下面演示网站 出错后自动添加出错日志的实例 (1)新建一个WebApplicatio ...
 - CentOS 磁盘阵列(raid10)
			
1.通过mdadm命令进行磁盘阵列部署 mdadm是multiple devices admin的简称,它是Linux下的一款标准的软件 RAID 管理工具 如果没有mdadm命令,通过yum安装一下 ...
 - [NOIP2017]逛公园 最短路图 拓扑序DP
			
---题面--- 题解: 挺好的一道题. 首先我们将所有边反向,跑出n到每个点的最短路,然后f[i][j]表示从i号节点出发,路径长比最短路大j的方案数. 观察到,如果图中出现了0环,那么我们可以通过 ...
 - 以安装PyTorch为例说明Anaconda在Windows/Linux上的使用
			
在Windows10上配置完MXNet 1.3.0后,再配置PyTorch 1.0时,发现两者需要依赖的NumPy版本不一致,之前是通过pip安装NumPy,根据pip的版本不同,会安装不同版本的Nu ...
 - BZOJ2395:[Balkan 2011]Timeismoney——题解
			
https://www.lydsy.com/JudgeOnline/problem.php?id=2395 有n个城市(编号从0..n-1),m条公路(双向的),从中选择n-1条边,使得任意的两个城市 ...
 - bzoj1968: [Ahoi2005]COMMON 约数研究(数论)
			
计算每一个数的贡献就好了..O(N) n/i只有2*sqrtn个取值于是可以优化到O(sqrtn) #include<bits/stdc++.h> #define ll long long ...
 - eclipse里配置Android ndk环境,用eclipse编译.so文件
			
做Android NDK开发时,c代码需要用ndk-build来进行编译,而java代码则需要用Android sdk编译. 编译c代码有两种方法: 一.写好c代码后,然后用cygwin搭建ndk-b ...