Git submodule学习笔记

参考自Git官方文档:7.11 Git 工具 - 子模块

开始使用子模块

将一个已存在的 Git 仓库添加为正在工作的仓库的子模块

1
$ git submodule add <子模块仓库地址>

克隆含有子模块的项目

普通的git clone命令默认会包含子模块的目录,但其中还没有任何文件,需要执行2个命令:

1
# 初始化本地配置文件
$ git submodule init
# 从该项目中抓取所有数据并检出父项目中列出的合适的提交
$ git submodule update

更简单的方式:

1
# 会自动初始化并更新仓库中的每一个子模块
$ git clone --recursive <包含子模块的仓库地址>

《算法图解》读书笔记

算法图解 [美] Aditya Bhargava

1.2 二分查找
1.2.1 更佳的查找方式
一般而言,对于包含n 个元素的列表,用二分查找最多需要log2 n 步,而简单查找最多需要n 步。

1.3 大O表示法
1.3.1 算法的运行时间以不同的速度增加
仅知道算法需要多长时间才能运行完毕还不够,还需知道运行时间如何随列表增长而增加。这正是大O表示法的用武之地。

Data Binding学习笔记——Attribute Setters

这是Data Binding学习笔记的最后一篇,我觉得 Attribute Setters 的特性大大提高了Data Binding库的可用性、拓展性。以下主要翻译自官方文档。

Attribute Setters(属性Setter)

当一个View绑定的数据发生变动时,自动生成的binding类其实会根据xml中的binding表达式来调用View对应属性的 setter 函数。Data binding 框架内置了几种自定义赋值的方法。

Data Binding学习笔记——Data Objects

关于Data Binding的基本使用在上一篇文章中已经做了总结,接下来会着重介绍下Data Binding库中个人认为最重要的两个特性:Data ObjectsAttribute Setters。前者是真正能让我们实现数据-UI双向绑定的关键;后者则为我们提供了自定义UI控件数据绑定的可能性。

当然,至于Data Binding其他的特性诸如自定义Binding Class命名Views with IDs(此特性可以完全取代Butterknife啦)等,查阅官方文档可以了。

Data Binding学习笔记——基本使用

参考链接:
http://yanghui.name/blog/2016/02/17/data-binding-guide/
https://developer.android.google.cn/topic/libraries/data-binding/index.html

Data Binding是google推出的布局与数据做双向绑定的库。它是一个support library,可以在 Android 2.1 (API level 7+)以上的平台使用,同时Android Plugin for Gradle的版本必须是 1.5.0-alpha1 以上。

编译环境

build.gradle中添加:

1
2
3
4
5
6
android {
    ....
    dataBinding {
        enabled = true
    }
}

有一点要注意,如果library项目中使用了data binding,app项目必须也得在build.gradle中声明以上配置。

《穿越计算机的迷雾》读书笔记

穿越计算机的迷雾

李忠

1.4 电流是怎样形成的
2017-04-06
电压的存在是导致电流产生的原因
2017-04-06
通常,衡量一个电源的重要指标是它的电压,也就是它产生电的能力。不同的电源,所提供的电压也不相同。

2.3 二进制数就是比特串
2017-04-10
对于单个的二进制数位,它们都只有一个称呼“比特”,每个比特具有两个可能的值:0或者1。

《图解HTTP》读书笔记

图解HTTP

上野宣、于均良

1.3 网络基础 TCP/IP
2016-11-16
通常使用的网络(包括互联网)是在 TCP/IP 协议族的基础上运作的。而 HTTP 属于它内部的一个子集。
2016-11-16
TCP/IP 协议族按层次分别分为以下 4 层:应用层、传输层、网络层和数据链路层。
2016-11-16
发送端在层与层之间传输数据时,每经过一层时必定会被打上一个该层所属的首部信息。反之,接收端在层与层传输数据时,每经过一层时会把对应的首部消去。
这种把数据信息包装起来的做法称为封装(encapsulate)。

1.4 与 HTTP 关系密切的协议 : IP、TCP 和 DNS
2016-11-17
IP 协议的作用是把各种数据包传送给对方。而要保证确实传送到对方那里,则需要满足各类条件。其中两个重要的条件是 IP 地址和 MAC 地址(Media Access Control Address)。
2016-11-17
为了准确无误地将数据送达目标处,TCP 协议采用了三次握手(three-way handshaking)策略

Android项目依赖配置说明(compile, apk or provided)

节选自https://developer.android.google.cn/studio/build/dependencies.html#library_dependency_configurations

Library dependency configurations

Inside the dependencies block, you can declare a library dependency using one of several different dependency configurations (such as compileshown above). Each dependency configuration provides Gradle different instructions about how to use the library. The following list describes each of the configurations you can use for a library dependency in your Android project.

Note: Although the Java Plugin for Gradle offers dependency configurations that are similar to those defined below, you cannot use them in your Android projects—only the following configurations are compatible with the Android plugin for Gradle.

compile(编译时依赖、打包到apk)
Gradle adds the dependency to the compilation classpath and to the APK.

apk(编译时不依赖、打包到apk)
Gradle adds the dependency to the APK only (it is not added to the compilation classpath).

provided(编译时依赖、不打包到apk)
Gradle adds the dependency to the compilation classpath only (it is not added to the APK). This is useful when you’re creating an Android library module and you need the dependency during compilation, but it’s optional to have present at runtime. That is, if you use this configuration, then your library module must include a runtime condition to check whether the dependency is available, and then gracefully change its behavior so it can still function if it’s not provided. This helps reduce the size of the final APK by not adding transient dependencies that aren’t critical.
You might also use this in an Android app module when your dependency is a JAR file that you need at compile-time and that you can safely assume is already available at runtime (and therefore you don’t want to copy it into your APK). Or perhaps you want to compile against the JAR specified with the provided configuration, but use the apk configuration to package a different JAR into the APK, which includes the same APIs you need at runtime.

Note: If you’re creating an Android app module, you cannot use provided for AAR dependencies, only for JARs. In an Android library module, you can use it for both JARs and AARs.

关于Android Library需要注意的细节

1. 设置库的资源为私有

我们都知道,库中的所有资源(res/目录的所有文件)在默认情况下均处于公开状态。如果不希望库的使用者访问这些资源,我们必须通过声明一个或多个公开资源的方式来使用这种自动私有标识机制。

具体做法:

在库的 res/value/ 目录下创建 public.xml 文件,添加 mylib_app_namemylib_public_string 为公开字符串资源。使用库的模块如果尝试引用库中的其他资源时,Lint会显示警告信息:

1
2
3
4
<resources>
    <public name="mylib_app_name" type="string"/>
    <public name="mylib_public_string" type="string"/>
</resources>

Android性能优化中的16ms问题(转)

转自:http://www.jianshu.com/p/a769a6028e51

前言

Android应用有一个明显的趋势—越来越多地使用动画效果来提升用户体验。但任何事情都是有代价的,丰富复杂的动画提升用户体验的同时,性能问题像隐形的恶魔一样,逐渐地侵蚀着你的应用。动画不流畅、界面卡顿开始困扰着你,逼着你进行性能优化。在这个优化过程中,最理想的标准就是绘制一帧的时间不要超过16ms。这是什么意思?让我们一探究竟。