Handler学习(1)

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) 不知道干嘛用的
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容