About Android 4 Handler

About Android 4 Handler

  • Handler
  • Message
  • MessageQueue
  • Looper
  • HandlerThread

Handler

handler 的使用方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//1 post postDelay
Handler.post / postDelay (new Runnable() {
@Override
void run() {
//todo
}
})

//2 sendMessage

创建handler
实现handlerMessage接口

handler.sendMessage(msg)

Activity finish时handler未执行完会引发Activity内存泄漏?

优化

  • 通过静态内部类+弱引用方式实现handler
  • 等等

HandlerThread

HandlerThread继承Thread.

run方法内进行Looper的初始化相关操作

Looper

  • Looper.prepare
    • 从TheadLocal中取得Looper对象,执行多次会抛出异常
1
2
3
4
5
6
7
8
9
10
11
12
13

static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();
//...
public static void prepare() {
prepare(true);
}

private static void prepare(boolean quitAllowed) {
if (sThreadLocal.get() != null) {
throw new RuntimeException("Only on lopper may be created per thread");
}
sThreadLocal.set(new Looper(quitAllowed));
}
  • Looper.loop()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static void loop() {
final Looper me = myLooper();
//..
final MessageQueue queue = me.mQueue;
//..
for(;;) {
Message msg = queue.next();
//..
msg.target.dispatchMessage(msg)
//ms.target 是一个handler对象
//Handler 在 enqueueMessage() 内为msg添加target
}
//..
msg.recycleUnchecked()
}
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2020 Kfdykme
  • Powered by Hexo Theme Ayer
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信