文档章节

Android双向绑定原理简述

t
 tommwq
发布于 05/26 02:07
字数 548
阅读 8
收藏 1

Android双向绑定原理简述

双向绑定涉及两个部分,即将业务状态的变化传递给UI,以及将用户输入信息传递给业务模型。

 

首先我们来看业务状态是如何传递给UI的。开启dataBinding后,编译器为布局activitymain.xml生成类ActivityMainBinding和它的实现类ActivityMainBindingImpl。抽象类ActivityMainBinding派生自ViewDataBinding,后者是BaseObserver的子类。ViewDataBinding有一个成员mChoreographer,它保存了主线程ActivityThread的Looper对象,业务状态的变更就是通过消息发送给主线程的,接着主线程完成对UI的更新。我们以一个例子来说明。对于下面的布局:

<?xml version="1.0" encoding="utf-8"?>
<layout>
    <data>
        <variable name="text" type="java.lang.String"/>
    </data>
    <androidx.constraintlayout.widget.ConstraintLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context=".MainActivity">

        <EditText
                android:id="@+id/label"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@={text}"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent"/>

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

当调用ActivityMainBinding.setText()时,执行的操作大致如下:

ActivityMainBindingImpl.setText()
  ViewDataBinding.requestRebind()
    ViewDataBinding.mChoregrapher.postFrameCallback()
      some_native_code()
        Choregrapher.FrameDisplayEventReceiver.onVsync()
          Choregrapher.FrameDisplayEventReceiver.mHandler.sendMessage()
...
Handler.dispatchMessage()
  Choregrapher.FrameDisplayEventReceiver.run()
    Choregrapher.doFrame()
      ViewDataBinding.executeBindings()
         TextViewBindingAdapter.setText()
           TestView.setText()

这里有两个地方要注意一下。首先,Choregrapher通过Looper.myLooper()得到Looper对象,而myLooper()返回了一个线程本地对象,因此ViewDataBinding对象必须在主线程中创建。其次,Handler分派消息(Handler.dispatchMessage)的顺序为Message.callback,Handler.mCallback,Handler.handleMessage。这种分派方式提高了消息处理的灵活性。

 

现在来考察用户输入是如何传递给业务模型的。当用户输入数据时,EditText会将信息传递给TextWatcher。双向绑定会自动建立TextWatcher对象,并注册到EditText,这个TextWatcher包含一个InverseBindingListener对象,当用户输入时,信息沿着下面的路径传递给ActivityMainBindingImpl对象。

EditText
  TextWatcher
    InverseBindingListener
      ActivityMainBindingImpl

因此通过ActivityMainBindingImpl对象,我们就可以直接得到用户的输入了。

© 著作权归作者所有

t

tommwq

粉丝 2
博文 24
码字总数 19636
作品 0
广州
私信 提问
Android之MVVM架构指南(二):DataBinding

DataBinding 出现的目的旨在取代方法,但是它的功能不仅如此。 配置 在中开启功能 在中启用新的编译器 基本操作 实现一个databinding基本上需要完成三个步骤的工作 1. 创建数据源 即普通的J...

吴七禁
2018/10/22
0
0
关于Android MvvM的一些体会

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zly921112/article/details/82849549 前言 由于我司项目较老有很多历史包袱代码结构也比较混乱,需求复杂的页...

zhuliyuan丶
2018/09/26
0
0
资本寒冬下的android面经

声明:作者:璇_c2be 链接:https://www.jianshu.com/p/089861329c1a 在2018年10月初,公司倒闭,无奈走上找工作的道路,不想自己平时图安逸,不思进取,再次找工作才发现,android行业也不是站在风...

终端研发部
02/27
0
0
Android开发利器之Data Binding Compiler V2 —— 搭建Android MVVM完全体的基础

原创声明: 该文章为原创文章,未经博主同意严禁转载。 前言: Android常用的架构有:MVC、MVP、MVVM,而MVVM是唯一一个官方提供支持组件的架构,我们可以通过Android lifecycle系列组件、D...

tangpj
2018/10/20
0
0
一起学Android之GridView

本文以一个简单的小例子,简述Android开发中GridView的常见应用,仅供学习分享使用。 概述 GiridView是一个表格显示资源的控件,可以在两个可滚动的方向上显示。列表项的资源会通过ListAdapt...

Alan.hsiang
02/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spark内置图像数据源初探

概述 在Apache Spark 2.4中引入了一个新的内置数据源, 图像数据源.用户可以通过DataFrame API加载指定目录的中图像文件,生成一个DataFrame对象.通过该DataFrame对象,用户可以对图像数据进行简...

阿里云官方博客
7分钟前
2
0
掌握Composer

这一次,真正掌握composer composer是现代PHP的基石 现代高级编程语言,依赖管理工具是必不可少的。Java有Maven,Python有pip,Nodejs有npm, 而在composer出现之前,PHP只有被广为诟病的Pea...

城市之雾
14分钟前
1
0
Shell中的函数、数组、告警系统

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析 20.20 告警系统主脚本 20.21 告警系统配置文件 20.22 告警系统监控项目 20.23/20.24/20.25 告警系统邮件引擎 20.26 ...

tobej
15分钟前
1
0
Win7系统安装hadoop

环境准备 安装JDK1.8,配置JAVA_HOME 下载hadoop_3.1.2,配置HADOOP_HOME 配置HDFS 修改hadoop-env.cmd 增加 set HADOOP_PREFIX=%HADOOP_HOME%set HADOOP_CONF_DIR=%HADOOP_PREFIX%\etc\ha......

铲平王
18分钟前
1
0
IT兄弟连 Java语法教程 Java语言的其他特性

Java语言中除了非常重要的跨平台特性外,还有如下几个关键特性: ● 语法简单易学 Java语言的语法简单明了,容易掌握,而且是纯面向对象(OOP)的语言,Java语言的简单性主要体现在以下几个方...

老码农的一亩三分地
31分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部