Android实用技术

2019日更挑战(十),Android-聊聊MVVM

2019-01-10  本文已影响45人  Jlanglang

瞎扯

经历了MVC MVP,然后就出现了MVVM,
不得不说.mvvm是最偷懒的那个.
人生苦短,谁方便就用谁咯

MVVM是啥

MVVM拆开,就是model,view,viewmodle.
model可以看成javabean,接口返回数据.反正是数据咯
View就是我们常写的布局啥的.
ViewModel其实相当于Presenter.Controller.换个叫法而已.

MVVM为什么受推崇.

还能因为啥,简单呗.

想一想
改一下model的属性.View就改变了
View改一下.model也改了.
.都不用手动去设置.能不受推崇吗.

从观察者的角度来认识MVVM

其实也是我们常说的响应式.
一个发生变化,一个作出响应.
观察者模式也是如此.

那么.

观察者是谁?
View.
被观察者是谁?
Model
谁负责通知?
ViewModel

MVVM有什么黑魔法?

为什么能model一改变,View就改变?

如果你有研究过,MVVM框架,就会发现.
其实没有什么黑魔法.
不过是框架帮你做set() get()工作而已.

当你改了model的数据时,实际上,set方法被代理了.在你修改的时候,框架帮你去
设置了View的属性.
当你修改View的时候.框架会检查View的值.与保存起来的model数据进行比较.如果
不一致就会通知更新.

没有什么黑魔法.不过是get.set而已.

如果你已经使用了kotlin,你就会知道 =号就是set.在kotlin里面一般是不写set的.

有人会问了,我写Android,没发现我的model有做改变啊?

android的mvvm框架.databinding对吧?

View方面:

其实很简单.用databind的时候,是不是有一个bind的操作?
我们平时更新ui.是不是都会走View刷新机制?
是不是会走invalidate()?
我是不是只有监听到了View有刷新.然后把model或者View的数据一对比.
是不是就知道有更新了?
被观察者有了触发的地方.接下来的是不是好办了......通知观察者就完了呗

Moel方面:

不用讲,肯定是编译时,set方法中注入代码.不信可以去看build中的编译文件.

来份假代码.


public class Test2 {
    public class Model {
        public int a;
        public ViewModel viewModel;

        public int getA() {
            return a;
        }

        public void setA(int a) {
            this.a = a;
            viewModel.notifyDataChange();
        }
    }

    public class View {
        public int b;
        public ViewModel viewModel;

        public int getB() {
            return b;
        }

        public void setB(int b) {
            this.b = b;
            viewModel.notifyViewChange();
        }
    }

    public class ViewModel {
        public Model model;
        public View view;

        public void bind(View view, Model model) {
            this.model = model;
            this.view = view;
        }

        public void notifyViewChange() {
            model.a = view.b;
        }

        public void notifyDataChange() {
            view.b = model.a;
        }
    }
}

差不多就这么个意思吧.今天有点水,第10天,


您的喜欢与回复是我最大的动力-_-
交流群:493180098

上一篇下一篇

猜你喜欢

热点阅读