android MVX杂谈

今天最后一天上班啦,还是有些小兴奋的。不知不觉中,2016年已经过去,一路走来,学到了很多,成熟了许多。当然,还有更长的路要走,套用公司2016公司年会的主题:2017,再起航。
这里写图片描述
mvc、mvp、mvvm都是根据单一职责原则对程序进行解耦。

一、MVC

模型层(Model):主要是程序中的数据、实体类以及业务逻辑,比如数据存储、bean、网络请求等。Model接受来自Controler的触发执行相应的业务,并将结果显示在View上;Model也可以通过观察者模式与View存在一定的耦合,直接由View触发执行业务。
视图层(View):主要是展示界面,View接受用户输入事件,然后触发Controler的逻辑,Model执行完业务后将结果显示在View上。
控制器层(Controller):主要是根据View不同的相互场景去触发Model相应的业务逻辑。
之前有人问我android中mvc设计模式的使用情况,当时的我认为m代表业务逻辑,v代表xml布局文件,c代表activity。现在回过头来看一看,当时的回答还是有些问题的。其实,普通android工程中只用到了mv,因为activity既像v,又像c,既处理数据绑定又进行事件处理,这样就使得m和v还是可以进行直接交互的,违背了高内聚低耦合的原则。
这里写图片描述
mvc按照单一职责原则给每个模块明确的分工,便于软件管理与设计,但是视图层和模型层耦合度高,经常出现视图层和模型层直接联系而架空了控制层。

二、MVP

mvp是mvc的变种,它使得m和p之间的交互通过p(Presenter)来完成,通过Presenter来刷新UI和更新数据model。其中,m还是业务逻辑、实体模型、数据库,v则表示activity、fragment、View等显示等显示模块,p则用于处理m和v的交互逻辑。我自己也写了一个登陆的demo,创建了大量的接口和实现类,感觉好麻烦的说,所以小项目还是算了,大项目为方便并行开发、单元测试以及后期维护再考虑这个框架吧。
这里写图片描述
为了提高Presenter的复用性,mvp中对view的引用一般通过接口Contact来实现,此时就有view界面,model数据,Presenter控制、Contact四个类了。这就导致在需要给view添加一个功能,或者添加一个展示逻辑时,需要同时修改View本身,view的接口,以及presenter的控制,工作量蛮大的,如下图的基本套路,Activit和Fragment代表V,Contact和Presenter代表P,data数据库代表M。mvp更加明确了各个模块的职责,使得视图层和模型层耦合度降低。
这里写图片描述

三、MVVM

mvvm(或者mvvp)为改善这一问题而出现的,mvvm削弱了presenter对view的依赖,presenter中不再需要持有view的引用,而是view通过binding技术,绑定presenter中变量的变化,从而对应的修改自身显示效果。但是mvvm对单元测试支持度不高,发现问题很难根据日志找出问题根源。mvvm将view的引用替换为binding,比如robobinding框架或者Data Binding库,下面以Data Binding库实践下吧。
本人使用的是android studio2.2.3,首先在需要使用mvvm的module中build.gradle添加支持
这里写图片描述

当时按照网上的例子还要添加依赖库(绝对有问题,费了我好久找原因)
这里写图片描述
报了如下错误:
Error:PARSE ERROR:
Error:unsupported class file version 52.0
Error:…while parsing android/databinding/parser/BindingExpressionBaseListener.class
Error:1 error; aborting
Error:Execution failed for task ‘:app:transformClassesWithDexForDebug’.

com.android.build.api.transform.TransformException: java.lang.RuntimeException: java.lang.RuntimeException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: java.lang.UnsupportedOperationException
把红框内的依赖去掉就ok了。
activity_mvvm.xml:

<?xml version="1.0" encoding="utf-8"?>
<layout
    xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <variable
            name="User"
            type="com.test.myapplication.bean.User"/>
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:text="@{User.username}"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </LinearLayout>
</layout>

其中User为自定义的实体类:

package com.test.myapplication.bean;

/**
 * Created by wilsen on 2017/1/23.
 */
public class User {
    private String username;
    private String password;


    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

android Studio会根据Layout的名称自动生成ViewModel类,
比如activity_main.xml会自动生成一个ActivityMainBinding类,
ActivityMainBinding中的方法,会根据layout中的属性自动生成。开始以为是自动绑定的,但是试了好几次都不行,于是手动绑定,当敲出Activity时会出现ActivityMainBinding提示的。
ActivityMvvmBinding binding= DataBindingUtil.setContentView(this,R.layout.activity_mvvm);
当时这一行出现了类型不匹配的错误,上网搜了下,通过图片方法解决问题
这里写图片描述
后面就是

ActivityMvvmBinding binding= DataBindingUtil.setContentView(this,R.layout.activity_mvvm);
        User user = new User();
        user.setUsername("Sunzxyong");
        user.setPassword("12345678");
        binding.setUser(user);

完成显示

Demo地址

参考文章:
Android官方MVP架构示例项目解析

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值