android中实现登录功能实现原理,用一个最简单的登录例子来了解Android的MVC和MVP架构的原理和实现...

在目前的Android开发中,MVP与MVC架构还有MVVM都非常流行,三者在不同的场景下都有各自的优势和劣势,一般而言会根据具体的业务场景来选择不同的模式,所以并不是说开发一个App一定完全遵循那种模式,完全可以根据业务场景不同混合多种模式。

从概念上讲,MVP和MVC虽然都含有Model和View,但是Model和View的职责并不相同。下面是MVC和MVP的结构示意图

a91de239061a

image.png

a91de239061a

image.png

在MVC中,箭头的方向A->B可以简单的理解为A在代码中出现了B,例如Controller->Model,可以理解为Activity有一个成员变量User,ControllerView可以理解为activity中有一个成员变量textview,textview也持有context(activity)这个对象。

而在MVP中,View和Model完全分离,通过中间的Presenter来传递消息。

Android的MVC并不是严格标准的MVC。

在Android中,通常而言M指的是数据模型(model类),V指的是XML文件和各种View组件,Controller则是Activity,Fragment这些带有生命周期的具体业务类。可是,Activity天生并不适合做Controller,因为View一定会在Activity中进行绑定(findviewbyid),所以Activity不可避免的还要做一些MVC中View的工作。因此,在Android的MVC中,Activity即是View又是Controller。这就导致了在一个业务复杂的Activity中,存在一大堆业务代码和UI控制代码,显的很臃肿,不利于维护和测试。

MVP可以很好的解决这个问题,在MVP中,我们就让Activity做一个纯粹的View,把具体的业务都剥离出去让Presenter做,每一个Presenter做不同的业务,这样就很方便维护和测试。

拿一个非常简单的登录界面来讲,我们现在要完成一个简单的业务,输入账号密码登录。

我们要完成四个功能:密码为空给出提示,账号为空给出提示,登录失败给出提示,登录成功显示欢迎xxx。

a91de239061a

login.gif

首先是使用MVC来完成这个业务,Api是一个模拟登录Api的类,SimpleDialog简单的封装了Dialog,可以忽略这些,具体代码可到文章末尾github地址查看。

在这个Activity即Controller中,持有了Model和一些View,同时Controller也做了部分View的工作。

a91de239061a

image.png

再来是MVP模式,一个最简单的MVP模式由IView接口类(定义界面什么时候改变),Presenter(具体业务)和一个Activity(界面显示+控制)组成,如下面三张图的代码所示。

我们发现,在这个MVP模式的Activity中,Api的请求没有了,非法账号密码的判断也没有了,而且Activity不再持有model类(user对象),activity只调用了presenter的具体业务方法,然后这些全由presenter负责,Activity现在看起来完全是一个View,只管怎么显示界面。

a91de239061a

image.png

当presenter完成业务后,势必要通知Activity对UI进行更改,我们定义了一个ILoginView接口,它确定了有哪些情况需要更改View,非常清晰。下面是ILoginView的代码,这四个接口分别是登录成功后ui的更改,因为登录成功后需要显示用户名字,所以传递了String的参数,其余三个为登录失败,非法的密码和非法的账号ui更新接口,根据业务的需要可以扩充这个接口和参数。

a91de239061a

image.png

接下来看看最神奇的presenter类,其实presenter也并没有那么神奇,仅仅是把MVC中activity的业务代码挪到了这里面,在这个presenter中,一定要传入ILoginView这个接口,同时现在他持有了Model(即user对象)而不再是Activity持有User,在LoginPresenter完成登录业务后,调用IlongView接口来通知Activity更改页面。

a91de239061a

image.png

现在回过头去看最初的结构图,应该能大致明白MVP的结构了吧。

MVP的好处就是剥离一个个业务,想象一下如果在这个界面增加注册,找回密码等业务,只要多增加几个presenter就可以了,而传统的MVC,把所有代码挤在Activity里,整个Activity是不是已经显的臃肿不堪。

项目地址

https://github.com/ccyzml/LoginCaseOnMVPMVC

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这里给出一个简单Android MVC实现登录功能例子: Model类:User.java ``` public class User { private String username; private String password; public User(String username, String password) { this.username = username; this.password = password; } public String getUsername() { return username; } public String getPassword() { return password; } } ``` View类:LoginActivity.java ``` public class LoginActivity extends AppCompatActivity { private EditText etUsername; private EditText etPassword; private Button btnLogin; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); etUsername = findViewById(R.id.et_username); etPassword = findViewById(R.id.et_password); btnLogin = findViewById(R.id.btn_login); btnLogin.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String username = etUsername.getText().toString(); String password = etPassword.getText().toString(); UserController userController = new UserController(); User user = userController.login(username, password); if (user != null) { Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(LoginActivity.this, "用户名或密码错误", Toast.LENGTH_SHORT).show(); } } }); } } ``` Controller类:UserController.java ``` public class UserController { private List<User> userList; public UserController() { userList = new ArrayList<>(); userList.add(new User("admin", "admin123")); userList.add(new User("user1", "user123")); userList.add(new User("user2", "user123")); } public User login(String username, String password) { for (User user : userList) { if (user.getUsername().equals(username) && user.getPassword().equals(password)) { return user; } } return null; } } ``` 在这个例子,View层负责用户界面的展示和交互;Model层负责数据的处理和存储;Controller层负责业务逻辑的处理。用户在View层输入用户名和密码后,点击登录按钮触发登录事件,View层将用户名和密码传递给Controller层进行业务处理,Controller层调用Model层的接口进行数据查询,查询结果返回给Controller层,Controller层再将结果返回给View层进行展示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值