Mr.HeXiang Blog

记录学习,学习记录


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 公益404

DexClassLoader和PathClassLoader的区别

贺祥 | 发表于 2019-02-09 | 分类于 Android
DexClassLoader和PathClassLoader的区别

1、DexClassLoader可以加载jar/apk/dex,可以从SD卡中加载未安装的apk
2、PathClassLoader只能加载系统中已经安装过的apk

FutureTask 与Future和Runable及Callable

贺祥 | 发表于 2019-02-09 | 分类于 Android
FutureTask 与Future和Runable及Callable

延申:
Future
Future就是对于具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果。

Callable
Callable接口很简单,是一个泛型接口,就是定义了一个call()方法,与Runnable的run()方法相比,这个有返回值,泛型V就是要返回的结果类型,可以返回子任务的执行结果。

Runnable
个泛型接口,执行任务没有返回结果,执行的方法体

FutureTask
FutureTask与Runnable,最大的区别有两个,一个是可以获取执行结果,另一个是可以取消

DataBinding

贺祥 | 发表于 2019-02-09 | 分类于 Android
Data Binding

正向绑定
当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
2
3
4
5
6
7
8
<layout ...>
<data>
<variable type="com.example.myapp.User" name="user"/>
</data>
<RelativeLayout ...>
<EditText android:text="@={user.name}" .../>
</RelativeLayout>
</layout>

跟单项绑定的差别,就是”@{}“改成了”@={}“,多了等号

@=符号,重要的是包括“=”符号,接收对属性的数据更改并同时侦听用户更新

Loop循环为什么不卡死

贺祥 | 发表于 2019-02-09 | 分类于 Android
Loop循环为什么不卡死

网上很多博文写,loop()之所以不卡死,是因为从管道文件中读取数据,主线程被唤醒只是为了读取消息,当消息读取完毕后会再次休眠。(回答的感觉没理解提议)

个人愚见:上面的只是节省了cpu资源,而真正原因之所以不卡死是因为消息能够及时分发屏幕传过来的触摸事件,没有触发anr,loop是死循环,后面的代码不会执行,但它本身不断的从MessageQueue中获取消息的,有消息就处理,没有消息,就阻塞.

anr原理:…..

InputManagerService

贺祥 | 发表于 2019-02-09 | 分类于 Android
InputManagerService

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单元(事件源)开始依次向外层传递。)的形式实现的。

JNI反射

贺祥 | 发表于 2019-02-09 | 分类于 Android
JNI反射

1.通过env指针获取jclass对象
2.通过env指针获取jmethodId
3.通过env指针反射调用方法

  1. 方法签名可以通过工具生成javap -s 对应class文件
  2. 有的方法参数需要转换Jni数据结构类型,否则会报错,比如String类型需要通过env指针转换
    (*env)->NewStringUTF(env, “这是弹窗的内容”)
    返回值的类型也是需要转换的
1
2
3
4
5
6
7
8
//生成jclas对象
jclass jclass1=(*env)->FindClass(env,"com/aimissu/testffmpeg/MainActivity");
//生成jmethodid
jmethodID jmethodID1=(*env)->GetStaticMethodID(env,jclass1,"testReflect","()V");
//反射并且调用方法
(*env)->CallStaticVoidMethod(env,jclass1,jmethodID1);
//删除本地引用释放内存,避免内存泄漏
(*env)->DeleteLocalRef(env,jclass1);

SparseArray及ArrayMap原理

贺祥 | 发表于 2019-02-09 | 分类于 Android
SparseArray及ArrayMap原理

SparseArray是android里为这样的Hashmap而专门写的类,目的是提高效率,其核心是折半查找函数(binarySearch)。在Android中,当我们需要定义

HashMap hashMap = new HashMap();
时,我们可以使用如下的方式来取得更好的性能.

SparseArray sparseArray = new SparseArray();

LruCache分析

贺祥 | 发表于 2019-02-09 | 分类于 Android
LruCache分析

工作原理
LruCache (Least Recently Used) 是安卓中一个关于内存缓存的类,特别是在操作图片的时候,大量的图片会导致oom,所以采用lru,可以保持一个最大size的内存缓存,最近使用的会放进队列的头部,如果超过这个size,最久未使用的放进队列的尾部,会首先删除,以保证内存不会无限增加.

实现
LruCache 封装了 LinkedHashMap,提供了 LRU 缓存的功能;
LruCache 通过 trimToSize 方法自动删除最近最少访问的键值对;
LruCache 不允许空键值;
LruCache 线程安全;
LruCache 的源码在不同版本中不一样,需要区分
继承 LruCache 时,必须要复写 sizeOf 方法,用于计算每个条目的大小。

特点

Key和Value都允许空
Key重复会覆盖Value允许重复
有序
非线程安全

LinkedHashMap

LinkedHashMap 继承了HashMap 实现了Map接口
HashMap+LinkedList,即它既使用HashMap操作数据结构,又使用LinkedList维护插入元素的先后顺序

单向链表

单向链表(单链表)是链表的一种,它由节点组成,每个节点都包含下一个节点的指针。

双向链表

双向链表(双链表)是链表的一种。和单链表一样,双链表也是由节点组成,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱

LinkedList

LinkedList类是双向列表,列表中的每个节点都包含了对前一个和后一个元素的引用.

HashMap

HashMap 是一个散列表,数组+单项链表 单向链表 它存储的内容是键值对(key-value)映射。

tring和StringBuffer 和 StringBuilder 类的区别

贺祥 | 发表于 2019-02-09 | 分类于 Android

前言

String和StringBuffer 和 StringBuilder 类的区别

String

字符串,字符串是常量,它们的值在创建之后不能更改。

第二次赋值其实改变了引用地址了,区分对象和引用

StringBuffer

字符串缓冲区(StringBuffer)支持可变的字符串,是线程安全的可变字符序列。可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步

StringBuilder

字符串缓冲区(StringBuilder)支持可变的字符串,适用于单个线程,与StringBuffer的最大区别是StringBuilder线程不安全。该类被设计用作 StringBuffer 的一个简易替换,如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。

简单的字符串用String
频繁更改变换修改的用StringBuilder或者StringBuffer
考虑线程安全用StringBuffer
单线程StringBullder
高性能StringBullder

ViewModel

贺祥 | 发表于 2019-02-09 | 分类于 Android
ViewModel

ViewModel类设计用于以生命周期意识的方式存储和管理与UI相关的数据。VIEWModel类允许数据在配置更改(如屏幕旋转)中生存。

1234…13
贺祥

贺祥

记学学记

123 日志
10 分类
65 标签
© 2023 贺祥
由 Hexo 强力驱动「Hosted by Coding Pages」
|
主题 — NexT.Pisces v5.1.3