view.post(Runnable action)
最近看了网上,在子线程更新UI的方法,说法很多,但都不是很全面。在此我争取做到总结的全面一些,希望以后对自己,对大家都有一些帮助。

这是view自带的方法,比较简单,如果你的子线程里可以得到要更新的view的话,可以用此方法进行更新。
view还有一个方法view.postDelayed(Runnable action, long delayMillis)用来延迟发送。


假如该方法是在子线程中
注意:context 对象要是 主线程中的MainActivity,这样强转才可以。
如果没有上下文(context),试试下面的方法:
1.用view.getContext()可以得到上下文。
2.跳过context直接用new Activity().runOnUiThread(Runnable action)来切换到主线程。


首先在主线程中定义Handler,Handler mainHandler = new Handler();(必须要在主线程中定义才能操作主线程,如果想在其他地方定义声明时要这样写Handler mainHandler = new Handler(Looper.getMainLooper()),来获取主线程的 Looper 和 Queue )

获取到 Handler 后就很简单了,用handler.post(Runnable r)方法把消息处理放在该 handler 依附的消息队列中(也就是主线程消息队列)。

(1):假如该方法是在子线程中

Handler mainHandler = new Handler(Looper.getMainLooper());
mainHandler.post(new Runnable() {
    @Override
    public void run() {
        //已在主线程中,可以更新UI
    }
});

Handler还有下面的方法:
1.postAtTime(Runnable r, long uptimeMillis); //在某一时刻发送消息
2.postAtDelayed(Runnable r, long delayMillis); //延迟delayMillis毫秒再发送消息
(2): 假设在主线程中

Handler myHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        switch(msg.what) {
            case 0:
                //更新UI等
                break;
            case 1:
                 //更新UI等
                break;
            default:
                break;
        }
    }
}

之后可以把 mainHandler 当做参数传递在各个类之间,当需要更新UI时,可以调用sendMessage一系列方法来执行handleMessage里的操作。
假设现在在子线程了

/**
  *获取消息,尽量用obtainMessage()方法,查看源码发现,该方法节省内存。
  *不提倡用Messenger msg=new Messenger()这种方法,每次都去创建一个对象,肯定不节省内存啦!
  *至于为什么该方法还存在,估计还是有存在的必要吧。(留作以后深入研究)
  */
Message msg = myHandler.obtainMessage();
msg.what = 0; //消息标识
myHandler.sendMessage(msg); //发送消息

如上代码,只是发送了个消息标识,并没有传其他参数。
如果想传递参数,可以这样:

  msg.what = 1;  //消息标识
  msg.arg1=2;   //存放整形数据,如果携带数据简单,优先使用arg1和arg2,比Bundle更节省内存。
  msg.arg2=3;   //存放整形数据
  Bundle bundle=new Bundle();
  bundle.putString("dd","adfasd");
  bundle.putInt("love",5);
  msg.setData(bundle);
  msg.obj=bundle;   //用来存放Object类型的任意对象
  myHandler.sendMessage(msg); //发送消息   

总结: msg.obj它的功能比较强大一下,至于它和利用Bundle传递数据,那个会效率高一些,更节省内存一些。个人认为:从传递数据的复杂程度看,由简单到复杂依次使用,arg1, setData(), obj。会比较好一些。
当然可以用简化方法sendEmptyMessage(int what)来减少不必要的代码,这样写:

myHandler.sendEmptyMessage(0); //其实内部实现还是和上面一样
发送消息的其他方法有:
endEmptyMessageAtTime(int what, long uptimeMillis); //定时发送空消息
sendEmptyMessageDelayed(int what, long delayMillis); //延时发送空消息
sendMessageAtTime(Message msg, long uptimeMillis); //定时发送消息
sendMessageDelayed(Message msg, long delayMillis); //延时发送消息
sendMessageAtFrontOfQueue(Message msg); //最先处理消息(慎用)

原创文章采用 CC BY-NC-SA 4.0协议 进行许可,转载请著名转自: 【Android】快速切换到主线程更新UI的几种方法

41 评论

  1. hvegaxvvtq 9月22日 回复

    博主真是太厉害了!!!

  2. ajsvvysstx 9月23日 回复

    叼茂SEO.bfbikes.com

  3. wweqlhmoyc 9月27日 回复

    怎么收藏这篇文章?

  4. ojanbogghn 9月27日 回复

    怎么收藏这篇文章?

  5. pqtuppwjes 10月4日 回复

    想想你的文章写的特别好https://www.ea55.com/

  6. scsfggaazm 10月19日 回复

    兄弟写的非常好 https://www.cscnn.com/

  7. tyaucwjpep 10月19日 回复

    文章的确不错啊https://www.cscnn.com/

  8. zavjjjqokd 11月14日 回复

    《死亡珠宝》泰国剧高清在线免费观看:https://www.jgz518.com/xingkong/59311.html

  9. qmmeeikwmj 11月14日 回复

    《亲爱的》恐怖片高清在线免费观看:https://www.jgz518.com/xingkong/144682.html

  10. fzzevnehmf 11月24日 回复

    《金喜澡堂》喜剧片高清在线免费观看:https://www.jgz518.com/xingkong/127403.html

  11. zsjbkibxxz 11月29日 回复

    《鬼使神差1987》喜剧片高清在线免费观看:https://www.jgz518.com/xingkong/134642.html

  12. iuiuhngeot 12月4日 回复

    《西厢记1965国语》爱情片高清在线免费观看:https://www.jgz518.com/xingkong/28966.html

  13. nylmdculqt 12月4日 回复

    《真爱如血第四季》欧美剧高清在线免费观看:https://www.jgz518.com/xingkong/34053.html

  14. rhzrwosqig 12月5日 回复

    《疾风使命》动作片高清在线免费观看:https://www.jgz518.com/xingkong/103910.html

  15. qxcxjotyyr 12月6日 回复

    《金喜澡堂》喜剧片高清在线免费观看:https://www.jgz518.com/xingkong/127403.html

  16. jlglqpbtyv 12月8日 回复

    《哈哈哈哈哈第三季》大陆综艺高清在线免费观看:https://www.jgz518.com/xingkong/56086.html

  17. pngzyjoglr 12月8日 回复

    《不能没有爱》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/61316.html

  18. ltusdypafc 12月14日 回复

    《外来媳妇本地郎4》国产剧高清在线免费观看:https://www.jgz518.com/xingkong/31543.html

  19. xkrxvihtyc 12月15日 回复

    《哈哈哈哈哈第三季》大陆综艺高清在线免费观看:https://www.jgz518.com/xingkong/56086.html

  20. 哈哈哈,写的太好了https://www.lawjida.com/

  21. ngnpnbmkcx 10月5日 回复

    新车即将上线 真正的项目,期待你的参与coinsrore.com

  22. edjeoispti 10月6日 回复

    新车即将上线 真正的项目,期待你的参与coinsrore.com

  23. zsstsooiny 10月7日 回复

    2025年10月新盘 做第一批吃螃蟹的人coinsrore.com
    新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
    新车首发,新的一年,只带想赚米的人coinsrore.com
    新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
    做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
    新车上路,只带前10个人coinsrore.com
    新盘首开 新盘首开 征召客户!!!coinsrore.com
    新项目准备上线,寻找志同道合的合作伙伴coinsrore.com
    新车即将上线 真正的项目,期待你的参与coinsrore.com
    新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
    新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com

  24. propxeihcs 10月7日 回复

    2025年10月新盘 做第一批吃螃蟹的人coinsrore.com
    新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
    新车首发,新的一年,只带想赚米的人coinsrore.com
    新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
    做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
    新车上路,只带前10个人coinsrore.com
    新盘首开 新盘首开 征召客户!!!coinsrore.com
    新项目准备上线,寻找志同道合 的合作伙伴coinsrore.com
    新车即将上线 真正的项目,期待你的参与coinsrore.com
    新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
    新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com

  25. 华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
    华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
    华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
    华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
    华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
    华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
    华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
    华纳公司合作开户所需材料?电话号码15587291507 微信STS5099

  26. 华纳个人账户开户流程?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】

  27. 华纳个人账户开户流程?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】

  28. 华纳东方明珠客服电话是多少?(▲18288362750?《?微信STS5099? 】
    如何联系华纳东方明珠客服?(▲18288362750?《?微信STS5099? 】
    华纳东方明珠官方客服联系方式?(▲18288362750?《?微信STS5099?
    华纳东方明珠客服热线?(▲18288362750?《?微信STS5099?
    华纳东方明珠24小时客服电话?(▲18288362750?《?微信STS5099? 】
    华纳东方明珠官方客服在线咨询?(▲18288362750?《?微信STS5099?

  29. 华纳东方明珠客服电话是多少?(▲18288362750?《?微信STS5099? 】
    如何联系华纳东方明珠客服?(▲18288362750?《?微信STS5099? 】
    华纳东方明珠官方客服联系方式?(▲18288362750?《?微信STS5099?
    华纳东方明珠客服热线?(▲18288362750?《?微信STS5099?
    华纳东方明珠24小时客服电话?(▲18288362750?《?微信STS5099? 】
    华纳东方明珠官方客服在线咨询?(▲18288362750?《?微信STS5099?

  30. 华纳东方明珠客服电话是多少?(??155--8729--1507?《?薇-STS5099】【?扣6011643?】
    华纳东方明珠开户专线联系方式?(??155--8729--1507?《?薇-STS5099】【?扣6011643?】

  31. 新盛开户前客服电话咨询材料清单【1558--7291-507薇同1】
    新盛开户官方客服电话 【1558--7291-507 薇同1】
    新盛开户业务办理电话 【1558--7291-507 薇同1】
    新盛开户联系电话大全 【1558--7291-507 薇同1】

  32. 新盛客服电话是多少?(?183-8890-9465—《?薇-STS5099】【
    新盛开户专线联系方式?(?183-8890--9465—《?薇-STS5099】【?扣6011643??】
    新盛客服开户电话全攻略,让娱乐更顺畅!(?183-8890--9465—《?薇-STS5099】客服开户流程,华纳新盛客服开户流程图(?183-8890--9465—《?薇-STS5099】

  33. 果博东方客服开户联系方式【182-8836-2750—】?薇- cxs20250806】
    果博东方公司客服电话联系方式【182-8836-2750—】?薇- cxs20250806】
    果博东方开户流程【182-8836-2750—】?薇- cxs20250806】
    果博东方客服怎么联系【182-8836-2750—】?薇- cxs20250806】

  34. 东方明珠客服开户联系方式【182-8836-2750—】?μ- cxs20250806
    东方明珠客服电话联系方式【182-8836-2750—】?- cxs20250806】
    东方明珠开户流程【182-8836-2750—】?薇- cxs20250806】
    东方明珠客服怎么联系【182-8836-2750—】?薇- cxs20250806】

  35. 华纳圣淘沙开户步骤详解(183-8890-9465—?薇-STS5099【6011643】华纳圣淘沙公司开户流程全解析(183-8890-9465—?薇-STS5099【6011643】
    华纳圣淘沙公司账户注册指南(183-8890-9465—?薇-STS5099【6011643】
    新手如何开通华纳圣淘沙公司账户(183-8890-9465—?薇-STS5099【6011643】
    华纳圣淘沙企业开户标准流程(183-8890-9465—?薇-STS5099【6011643】
    华纳圣淘沙公司开户:从零到一(183-8890-9465—?薇-STS5099【6011643】
    官方指南:华纳圣淘沙公司开户流程(183-8890-9465—?薇-STS5099【6011643】
    华纳圣淘沙公司开户流程说明书(183-8890-9465—?薇-STS5099【6011643】

  36. 华纳圣淘沙公司开户新手教程零基础学会(183-8890-9465薇-STS5099)
    华纳圣淘沙公司开户华纳圣淘沙公司开户保姆级教程(183-8890-9465薇-STS5099)一步步教你开通华纳圣淘沙公司账户(183-8890-9465薇-STS5099)华纳圣淘沙公司开户分步图解首次开户必看:(183-8890-9465薇-STS5099)
    华纳圣淘沙全攻略华纳圣淘沙公司开户实操手册(183-8890-9465薇-STS5099)
    华纳圣淘沙开户流程视频教程手把手教学:(183-8890-9465薇-STS5099)
    华纳圣淘沙公司开户华纳圣淘沙公司开户完全指南(183-8890-9465薇-STS5099)

  37. 寻找华纳圣淘沙公司开户代理(183-8890-9465薇-STS5099】华纳圣淘沙官方合作开户渠道(183-8890-9465薇-STS5099】华纳圣淘沙公司开户代理服务(183-8890-9465薇-STS5099】华纳圣淘沙公司开户咨询热线(183-8890-9465薇-STS5099】联系客服了解华纳圣淘沙开户(183-8890-9465薇-STS5099】
    华纳圣淘沙公司开户专属顾问(183-8890-9465薇-STS5099】

  38. 华纳公司官方开户渠道?(183-8890-9465)-薇-STS5099【6011643】
    如何通过官方渠道申请华纳公司账户?(183-8890-9465)-薇-STS5099【6011643】
    华纳总公司官方开户指南?(183-8890-9465)-薇-STS5099【6011643】
    华纳公司官方开户所需材料?(183-8890-9465)-薇-STS5099【6011643】
    华纳官方开户流程?(183-8890-9465)-薇-STS5099【6011643】
    华纳公司官方开户申请步骤?(183-8890-9465)-薇-STS5099【6011643】
    华纳官方开户指南?(183-8890-9465)-薇-STS5099【6011643】
    华纳总公司官方开户?(183-8890-9465)-薇-STS5099【6011643】
    华纳公司官方开户所需材料?(183-8890-9465)-薇-STS5099【6011643】
    华纳官方开户申请流程?(183-8890-9465)-薇-STS5099【6011643】

  39. a0dl.cn 11月24日 回复

    奉化方桥小巷子a0hk.cn