学习1

1.Handler 机制

Handler 机制

创建 Handler,Handler获取当前线程的 looper和 queue,queue 将 message 加入合适的位置,looper 循环从 queue中取出 message,分发 message。

Looper.prepare()创建一个 Looper 对象,放入 sThreadLocal 变量中

Looper创建 MessageQueue 消息队列,并让当前的 looper 持有当前线程

Handler 在创建的时候,获取当前线程的 looper(sThreadLocal.get()),通过 looper持有queue 队列

Looper.loop() 循环通过 queue.next()获取 message 对象,并通过dispatchMessage分发 msg,若 queue 中没有 msg,则next()阻塞,挂起当前线程,若 queue 返回 null,结束死循环。

queue.next()方法中也有一个死循环,若有可以处理的 msg,返回 msg 给 looper 处理,若没有可以处理的 msg,执行 IdlHandler,否则就一直在循环,若 looper 结束,则返回 null,结束死循环。

1.1 如果消息队列为空

如果消息队列为null,抛出RuntimeException 异常,如果是队列为空,queue.next()取出 message 为空,则挂起当前线程

1.2 postDelay() 30分钟,调整系统时间会怎样

postDelay()延时,使用SystemClock.uptimeMillis() + delayMillis 实现,SystemClock.uptimeMillis()获取从手机开机到现在的毫秒时间(不含深度睡眠时间),所以修改系统时间不会影响 postDelay() 30分钟后的操作

1.3ThreadLocal

线程局部变量,同一个 ThreadLocal 所包含的对象,在不同的 Thread 中有不同的副本

1.4 IdleHandler

在当前线程消息队列空闲时做些事情,queueIdle返回 true 说明执行后,在下次进入空闲状态后继续执行,返回 false 只执行一次,执行完后删除

第三方库是否使用不详,LeakCanary,Glide用过?

2.JAVA 内存模型

在 Java 内存模型中,我们统一用工作内存(working memory)来当作 CPU 中寄存器或高速缓存的抽象。线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有工作内存(类比 CPU 中的寄存器或者高速缓存),本地工作内存中存储了该线程读/写共享变量的副本。

3.sync/volatile

当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。(保证多线程操作的可见性,但是不能保证变量的原子性)

synchronized能保证变量的原子性、可见性和有序性

在单例模式下

1
2
3
4
5
6
7
8
9
10
11
12
private static volatile LoginLogic instance; 
// 保证在多线程执行初始化的时候,已经初始化后的变量对其他线程是可见的
public static LoginLogic getInstance() {
if (instance == null) {
synchronized (LoginLogic.class) { // 多个线程只有一个线程执行下面的初始化代码段
if (instance == null) { // 初始化后volatile保证可见性确保其他线程在这个阶段变量!=null
instance = new LoginLogic();
}
}
}
return instance;
}
  1. System.currentTimeMillis()是一个标准的“墙”时钟(时间和日期),表示从纪元到现在的毫秒数。该墙时钟能够被用户或电话网络(见setCurrentTimeMillis(long))设置,所以该时间可能会向前或向后不可预知地跳越。该时钟应该仅仅被使用在当现实世界的对应的日期和时间是重要的情况,例如一个日历或闹钟应用程序。而间隔时间和经过时间应该使用不同的时钟。如果你使用System.currentTimeMillis(),可以考虑监听ACTION为ACTION_TIME_TICK、ACTION_TIME_CHANGED、ACTION_TIMEZONE_CHANGED 的广播去监听时间变化。

  2. uptimeMillis()表示自系统启动时开始计数,以毫秒为单位。返回的是从系统启动到现在这个过程中的处于非休眠期的时间。当系统进入深度睡眠时(CPU关闭,设备变黑,等待外部输入装置)该时钟会停止。但是该时钟不会被时钟调整,闲置或其他节能机所影响。这是大多数间隔时间的基本点,例如Thread.sleep(millls)、Object.wait(millis)和System.nanoTime()。该时钟被保证是单调的,适用于检测不包含休眠的间隔时间的情况。大多数的方法接受一个时间戳的值除了uptimeMillis()时钟。

  3. elapsedRealtime() and elapsedRealtimeNanos() 返回系统启动到现在的时间,包含设备深度休眠的时间。该时钟被保证是单调的,即使CPU在省电模式下,该时间也会继续计时。该时钟可以被使用在当测量时间间隔可能跨越系统睡眠的时间段。

作者:活这么大就没饱过
链接:https://www.jianshu.com/p/1d5ef19f1faa
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

0%