android MVX杂谈

来源:互联网 发布:宿州淘宝xinsuzhou 编辑:程序博客网 时间:2024/06/11 09:13

今天最后一天上班啦,还是有些小兴奋的。不知不觉中,2016年已经过去,一路走来,学到了很多,成熟了许多。当然,还有更长的路要走,套用公司2016公司年会的主题:2017,再起航。
这里写图片描述
之前有人问我android中mvc设计模式的使用情况,当时的我认为m代表业务逻辑,v代表xml布局文件,c代表activity。现在回过头来看一看,当时的回答还是有些问题的。其实,普通android工程中只用到了mv,因为activity既像v,又像c,既处理数据绑定又进行事件处理,这样就使得m和v还是可以进行直接交互的,违背了高内聚低耦合的原则。
这里写图片描述
为优化这一问题,mvp应运而生,它使得m和p之间的交互通过p(Presenter)来完成。其中,m还是业务逻辑和实体模型,v则表示activity、fragment、View等显示等显示模块,p则用于处理m和v的交互逻辑。我自己也写了一个登陆的demo,创建了大量的接口和实现类,感觉好麻烦的说,所以小项目还是算了,大项目为方便并行开发、单元测试以及后期维护再考虑这个框架吧。
这里写图片描述
为了提高Presenter的复用性,mvp中对view的引用一般通过接口来实现,这就导致在需要给view添加一个功能,或者添加一个展示逻辑时,需要同时修改View本身,view的接口,以及presenter的控制,工作量蛮大的。mvvm(或者mvvp)为改善这一问题而出现的,mvvm削弱了presenter对view的依赖,presenter中不再需要持有view的引用,而是view通过binding技术,绑定presenter中变量的变化,从而对应的修改自身显示效果。严格意义上讲,其实还是MVP,只不过将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);

完成显示

1 0
原创粉丝点击