示例效果

一共三个控件,EditText,Button,TextView

成功显示账号信息,查询失败显示错误信息。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/pureWhite"> <Button
android:id="@+id/btnQuery"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="64dp"
android:text="获取账号信息"
android:textColor="@color/pureWhite"
android:textSize="20dp"
android:onClick="ButtonClick"
android:theme="@style/GenericButtonStyle"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/etAccount" /> <EditText
android:id="@+id/etAccount"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="84dp"
android:ems="10"
android:hint="输入账号"
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Name" /> <TextView
android:id="@+id/tvResult"
android:layout_width="0dp"
android:layout_height="30dp"
android:layout_marginTop="40dp"
tools:text="查询结果"
android:textSize="20sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btnQuery" /> </androidx.constraintlayout.widget.ConstraintLayout>

主界面代码

控件关键信息

注意:为了简化,这里查询数据库用的是模拟操作,随机成功或者失败。

不使用任何框架的传统做法

新建用户信息类Account和回调接口

public class Account {
private String name;
private int level;
public interface ResultCallback {
void onSuccess(Account account); void onFailure();
}

Activity中的代码

public class HelloActivity extends AppCompatActivity {
private TextView tvResult;
private EditText etAccount;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test);
tvResult = findViewById(R.id.tvResult);
etAccount = findViewById(R.id.etAccount);
} public void ButtonClick(View view) {
String userInput=getUserInput();
getAccountData(userInput, new ResultCallback() {
@Override
public void onSuccess(Account account) {
showSuccessPage(account);
} @Override
public void onFailure() {
showFailurePage();
}
});
} private String getUserInput() {
return etAccount.getText().toString();
} private void showSuccessPage(Account account) {
tvResult.setText("用户账号:"+account.getName()+"|"+
"用户等级:"+account.getLevel());
}
private void showFailurePage() {
tvResult.setText("获取数据失败");
} private void getAccountData(String accountName, ResultCallback cb) {
Random random=new Random();
boolean isSuccess=random.nextBoolean();
if (isSuccess) {
Account account = new Account();
account.setName(accountName);
account.setLevel(100);
cb.onSuccess(account);
} else {
cb.onFailure();
}
} }

MVC

Account和ResultCallback同上

MVCModel代码

public class MVCModel {
public void getAccountData(String accountName, ResultCallback cb) {
Random random=new Random();
boolean isSuccess=random.nextBoolean();
if (isSuccess) {
Account account = new Account();
account.setName(accountName);
account.setLevel(100);
cb.onSuccess(account);
} else {
cb.onFailure();
}
}
}

MVCActivity代码

public class MVCActivity extends AppCompatActivity {
private TextView tvResult;
private EditText etAccount;
private MVCModel model;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test);
tvResult = findViewById(R.id.tvResult);
etAccount = findViewById(R.id.etAccount);
model=new MVCModel();
} public void ButtonClick(View view) {
String userInput=getUserInput();
model.getAccountData(userInput, new ResultCallback() {
@Override
public void onSuccess(Account account) {
showSuccessPage(account);
} @Override
public void onFailure() {
showFailurePage();
}
});
} private String getUserInput() {
return etAccount.getText().toString();
} private void showSuccessPage(Account account) {
tvResult.setText("用户账号:"+account.getName()+"|"+
"用户等级:"+account.getLevel());
}
private void showFailurePage() {
tvResult.setText("获取数据失败");
}
}

 MVC模式缺点

Controller View不能完全解耦。

Activity过于臃肿,需要承担部分业务代码。

Android MVC MVP MVVM (一)的更多相关文章

  1. android MVC && MVP && MVVM分析和对比

    相关:http://www.cnblogs.com/wytiger/p/5305087.html 出处http://blog.csdn.net/self_study,对技术感兴趣的同鞋加群544645 ...

  2. Android MVC,MVP,MVVM模式入门——重构登陆注册功能

    一  MVC模式: M:model,业务逻辑 V:view,对应布局文件 C:Controllor,对应Activity 项目框架: 代码部分: layout文件(适用于MVC和MVP两个Demo): ...

  3. Android MVC MVP MVVM (三)

    MVVM Model-View-ViewModel的简写 在MVP基础上实现数据视图的DataBinding,数据变化,视图自动变化,反之也成立. DataBinding 启用DataBinding ...

  4. Android MVC MVP MVVM (二)

    MVP模型 View主要是Activity,Fragment MVP和MVC的差别 1.Model和View不再直接通信,通过中间层Presenter来实现. 2.Activity的功能被简化,不再充 ...

  5. Android App的设计架构:MVC,MVP,MVVM与架构经验谈

    相关:http://www.cnblogs.com/wytiger/p/5996876.html 和MVC框架模式一样,Model模型处理数据代码不变在Android的App开发中,很多人经常会头疼于 ...

  6. Android App的设计架构:MVC,MVP,MVVM与架构AAAAA

    1. 架构设计的目的1.1 通过设计使程序模块化,做到模块内部的高聚合和模块之间的低耦合.1.2 这样做的好处是使得程序在开发的过程中,开发人员只需要专注于一点,提高程序开发的效率,并且更容易进行后续 ...

  7. 用户界面编程模式 MVC MVP MVVM

    用户界面编程模式 MVC MVP MVVM 程序 = 数据 + 算法 数据:就是待处理的东西 算法:就是代码 涉及到人机交互的程序,不可避免涉及到界面和界面上显示的数据原始方式是界面代码和逻辑代码糅合 ...

  8. MVC, MVP, MVVM比较以及区别(上)

    MVC, MVP和MVVM都是用来解决界面呈现和逻辑代码分离而出现的模式.以前只是对它们有部分的了解,没有深入的研究过,对于一些里面的概念和区别也是一知半解.现在一边查资料,并结合自己的理解,来谈一下 ...

  9. MVC, MVP, MVVM比较以及区别

    MVC, MVP和MVVM都是用来解决界面呈现和逻辑代码分离而出现的模式.以前只是对它们有部分的了解,没有深入的研究过,对于一些里面的概念和区别也是一知半解.现在一边查资料,并结合自己的理解,来谈一下 ...

随机推荐

  1. CentOS 7 yum update 升级提示:PackageKit 锁定解决方案

    CentOS 7 系列新安装后都会进行yum update操作,但每次都会遇到PackageKit 锁定问题,提示如下: /var/run/yum.pid 已被锁定,PID 为 2694 的另一个程序 ...

  2. nginx之location部署yii项目(不使用nginx端口转发)

    前言: 之前部署yii项目的时候, 使用的是域名, 后来使用nginx进行端口转发(反向代理)来部署yii项目. 这一次部署尝试只使用location 进行部署(不需要使用端口). 先贴出nginx的 ...

  3. CF1230 E. Kamil and Making a Stream gcd+暴力

    比赛的时候TLE,第二天发现合并方向合并错了~ 改了一下顺序就切了~ 又掉分了,好难过QAQ...... Code: #include <bits/stdc++.h> #define N ...

  4. 北京清北 综合强化班 Day5

    T1 思路: 输入数据,sort一下, 如果a[i]>sum+1(前缀和) 那么sum+1就一定不会被拼出来, 然后输出即可. 上代码: #include <iostream> #i ...

  5. 「BZOJ 1698」「USACO 2007 Feb」Lilypad Pond 荷叶池塘「最短路」

    题解 从一个点P可以跳到另一个点Q,如果Q是水这条边就是1,如果Q是荷叶这条边权值是0.可以跑最短路并计数 问题是边权为0的最短路计数没有意义(只是荷叶的跳法不同),所以我们两个能通过荷叶间接连通的点 ...

  6. 想学习linux操作系统,于是选择了在win8 虚拟机VM player 里装了Linux版本Centos7

    第一次接触linux,第一次玩linux的命令行哈. 以下python使用的都是自带的python2.x版本 先新建一个简单的文件夹py_studydir 新建该文件夹下面的一个py文件 写入pyth ...

  7. bat 通过命令以管理员方式运行程序

    @echo off mode con lines= cols= % mshta vbscript:CreateObject()(window.close)&&exit cd /d &q ...

  8. js中的DOM对象和jQuery对象的比较

    1. 二者的不同之处: 通过jQuery获取的元素是一个数组, 数组中包含着原生JS中的DOM对象. 例如, 针对下面的一个div结构: <div id="Box">& ...

  9. MIME协议(六) -- MIME实例分析

    MIME实例分析 了解MIME协议的基本组织结构后,下面用Outlook Express撰写出一封显示效果如图4所示的电子邮件,然后分析该邮件的源文件,以便读者更加深入地了解MIME协议. 1. 启动 ...

  10. codeforces#1196F. K-th Path(最短路,思维题)

    题目链接: https://codeforces.com/contest/1196/problem/F 题意: 在无向图的所有最短路点对中,求出第$k$大 数据范围: $ 1 \leq k \leq ...