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

5 评论

  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/