Android

Handler学习(1)

2019-06-28  本文已影响2人  景山道人

Handler介绍:

以下内容来自API27官方JavaDoc,封装的比较好,里面内容并不多,所以干脆把比较有意义的都翻译了一遍,记在这里

  1. 什么是Handler:
    Handler能够发送和处理消息和与线程消息队列相关的Runnable对象。每个Handler实例都和单个线程及其消息队列关联。创建一个Handler时,它会和创建它的线程/消息队列绑定,因此它回将消息和runnable发给那个消息队列,且当它们从消息队列中出来时,回执行它们。
  2. Handler的主要用途
    • 给消息和runnable定时以便在未来的某个时刻执行
    • 给一项行为排队来让它在不同的线程中运行
  3. 和定时有关的方法
    • post: 给线程排队来使其在接到相应消息时被消息队列处理,此消息队列是Handler创建时绑定的消息队列/线程
    • postAtTime
    • postDelayed
    • sendEmptyMessage
    • sendMessage ———— handleMessage
    • sendMessageAtTime
    • sendMessageDelayed
  4. Handler可以用sendMessagepost方法来进行子线程和UI线程间的通信

Handler的内部方法等:

构造方法:

  1. Handler() 默认,不设置callback和async,必须在已经初始化过Looper的线程中创建
  2. Handler(Callback callback)可以自己实现Callback接口来处理消息,必须在已经初始化过Looper的线程中创建,Callback可以为空
  3. Handler(Looper looper) 自己创建一个Looper来初始化Handler
  4. Handler(Looper looper, Callback callback)
    以下三个构造方法被标注为@hide,可以认为async相关的方法在这个版本默认不提供使用
  5. Handler(boolean async) 让Handler严格异步处理消息,异步消息不需要和同步消息相关的全局排序,也不受同步屏障限制
  6. Handler(Callback callback, boolean async) 以上的构造方法除了自己创建Looper之外都会将默认行为传到这里
  7. Handler(Looper looper, Callback callback, boolean async)

其他方法:

  1. Callback
    Handler的一个内部接口,可以用来实现Handler的handleMessage方法
  2. handleMessage(Message msg)
  3. dispatchMessage(Message msg)处理系统消息
  4. getMain() 获取一个主线程的handler,已标记为hide
  5. mainIfNull()判断Handler是否为空,为空则返回一个主线程的Handler,已标记为Hide
  6. getTraceName() 返回message中的what,已标记为hide
  7. getMessageName() 将what中的内容转为16进制再输出
  8. obtainMessage() 获取一个Handler为当前Handler的新Message,效率比创建和分配新的实例要高,如果不需要当前Handler,可以直接Message.obtain()
  9. obtainMessage(int what) 获取并设置what
  10. obtainMessage(int what, Object obj)
  11. obtainMessage(int what, int arg1, int arg2)
  12. obtainMessage(int what, int arg1, int arg2, Object obj)
  13. post(Runnable r) { return sendMessageDelayed(getPostMessage(r), 0); }
    很明显就是发送一个0延迟的message,runnable运行在Handler的绑定线程上
    如果成功放入消息队列中,返回true,失败为false,一般情况下是已经存在一个正在处理该消息队列的Looper了
  14. postAtTime(Runnable r, long uptimeMillis)
  15. postAtTime(Runnable r, Object token, long uptimeMillis)
    关于以上两条,返回true并不代表传入的runnable一定会被执行
  16. postAtFrontOfQueue(Runnable r) 将runnable直接插入下个迭代中,仅适合在特殊情况下使用,很容易出问题
  17. runWithScissors(final Runnable r, long timeout)
    同步运行某项任务,可能导致死锁,被标注为hide

文档部分原文:This method is prone to abuse and should probably not be in the API. If we ever do make it part of the API, we might want to rename it to something less funny like runUnsafe().

  1. removeCallbacks(Runnable r) 把runnable在消息队列中的post全部删掉
  2. removeCallbacks(Runnable r, Object token) 把带token的post都删掉,如果token为空,则全删掉
  3. sendMessage(Message msg) 把消息推进消息队列末尾,会被handleMessage方法接收,成功返回true
  4. sendEmptyMessage(int what) 发一个只有what值的message
  5. sendEmptyMessageDelayed(int what, long delayMillis)
  6. sendEmptyMessageAtTime(int what, long uptimeMillis)
  7. sendMessageDelayed(Message msg, long delayMillis)
  8. sendMessageAtTime(Message msg, long uptimeMillis)
  9. sendMessageAtFronOfQueue(Message msg) 众所周知,并不建议使用这个
  10. removeMessages(int what) 去掉又有带该what值的message
  11. removeMessages(int what, Object object) 带what和object的message
  12. removeCallbacksAndMessages(Object token) token为空的话删掉所有的
  13. hasMessages(int what)
  14. hasMessagesOrCallbacks()
  15. hasMessages(int what, Object object)
  16. hasCallbacks(Runnbale r)
  17. getLooper 从官方的注释来看,这个方法离死不远了

官方:if we can get rid of this method, the handler need not remember its loop, we could instead export a getMessageQueue() Method..

  1. public final void dump(Printer pw, String prefix) 不知道干嘛用的
上一篇下一篇

猜你喜欢

热点阅读