DexClassLoader和PathClassLoader的区别
1、DexClassLoader可以加载jar/apk/dex,可以从SD卡中加载未安装的apk
2、PathClassLoader只能加载系统中已经安装过的apk
记录学习,学习记录
正向绑定
当user.name的数据改动时,我们的TextView都会同步改变文字。1
2
3
4
5
6
7
8<layout ...>
<data>
<variable type="com.example.myapp.User" name="user"/>
</data>
<RelativeLayout ...>
<TextView android:text="@{user.name}" .../>
</RelativeLayout>
</layout>
双向绑定
现在假设一种情况,当你更换成EditText时,如果你的用户名User.name已经绑定到EditText中,当用户输入文字的时候,你原来的user.name数据并没有同步改动,因此我们需要修改成:
1 | <layout ...> |
跟单项绑定的差别,就是”@{}“改成了”@={}“,多了等号
@=符号,重要的是包括“=”符号,接收对属性的数据更改并同时侦听用户更新
InputManagerService触摸事件的采集及分发,比如按下,滑动,锁屏拍照等等事件
在SystemService进程启动startOtherService中和WindowManageService一起启动了
InputReader读取事件(InputReader.cpp)
创建个线程循环 Looper线程,通过EventHub的getEvents获取Input事件,转换成EventEntry事件加入到InputDispatcher的mInboundQueue。
InputDispatcher事件派发事件(InputDispatcher.cpp)
创建一个线程派发事件,Looper线程,基于native的Looper实现了Hanlder消息处理模型,如果有Input事件到来就被唤醒处理事件,处理完毕后继续睡眠等待
dispatchOnceInnerLocked ANR触发
派发事件通过findTouchedWindowTargetsLocked找到目标Window,进而通过dispatchEventLocked将消息发送到目标窗口(通过Socket将事件发送到目标窗口)
将监听事件交给ViewRootImpl中的rootView
android 事件响应机制是先 分发(先由外部的View接收,然后依次传递给其内层的最小View)再 处理 (从最小View单元(事件源)开始依次向外层传递。)的形式实现的。
1.通过env指针获取jclass对象
2.通过env指针获取jmethodId
3.通过env指针反射调用方法
- 方法签名可以通过工具生成javap -s 对应class文件
- 有的方法参数需要转换Jni数据结构类型,否则会报错,比如String类型需要通过env指针转换
(*env)->NewStringUTF(env, “这是弹窗的内容”)
返回值的类型也是需要转换的
1 | //生成jclas对象 |
工作原理
LruCache (Least Recently Used) 是安卓中一个关于内存缓存的类,特别是在操作图片的时候,大量的图片会导致oom,所以采用lru,可以保持一个最大size的内存缓存,最近使用的会放进队列的头部,如果超过这个size,最久未使用的放进队列的尾部,会首先删除,以保证内存不会无限增加.
实现
LruCache 封装了 LinkedHashMap,提供了 LRU 缓存的功能;
LruCache 通过 trimToSize 方法自动删除最近最少访问的键值对;
LruCache 不允许空键值;
LruCache 线程安全;
LruCache 的源码在不同版本中不一样,需要区分
继承 LruCache 时,必须要复写 sizeOf 方法,用于计算每个条目的大小。
特点
Key和Value都允许空
Key重复会覆盖Value允许重复
有序
非线程安全
LinkedHashMap 继承了HashMap 实现了Map接口
HashMap+LinkedList,即它既使用HashMap操作数据结构,又使用LinkedList维护插入元素的先后顺序
单向链表(单链表)是链表的一种,它由节点组成,每个节点都包含下一个节点的指针。
双向链表(双链表)是链表的一种。和单链表一样,双链表也是由节点组成,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱
LinkedList类是双向列表,列表中的每个节点都包含了对前一个和后一个元素的引用.
HashMap 是一个散列表,数组+单项链表 单向链表 它存储的内容是键值对(key-value)映射。
String和StringBuffer 和 StringBuilder 类的区别
字符串,字符串是常量,它们的值在创建之后不能更改。
第二次赋值其实改变了引用地址了,区分对象和引用
字符串缓冲区(StringBuffer)支持可变的字符串,是线程安全的可变字符序列。可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步
字符串缓冲区(StringBuilder)支持可变的字符串,适用于单个线程,与StringBuffer的最大区别是StringBuilder线程不安全。该类被设计用作 StringBuffer 的一个简易替换,如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。
简单的字符串用String
频繁更改变换修改的用StringBuilder或者StringBuffer
考虑线程安全用StringBuffer
单线程StringBullder
高性能StringBullder