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的几种方法

26 评论

  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