handler.post运行线程

时间:2022-09-04 17:29:12
handler.post(new Runnable()
        {
            
            @Override
            public void run()
            {
                System.out.println(Looper.myLooper().getThread()+"post");
                textView.setText("alreadly changed");
            }
        });

各位大神求指教啊,new 一个runnable不是开启一个新线程么,为什么在这就不适用了呢。通过打印可以得出还是运行在main线程里面,也能更新UI主键。为啥是这样呢,为啥呢??

16 个解决方案

#1


handler.post(new Runnable()
        {
            
            @Override
            public void run()
            {
                System.out.println(Looper.myLooper().getThread()+"post");
                textView.setText("alreadly changed");
            }
        });

各位大神求指教啊,new 一个runnable不是开启一个新线程么,为什么在这就不适用了呢。通过打印可以得出还是运行在main线程里面,也能更新UI主键。为啥是这样呢,为啥呢??
我也不知道,帮你顶一下吧。。。

#2


谁告诉你new Runnable()是开新线程的?

#3


引用 2 楼 hjywyj 的回复:
谁告诉你new Runnable()是开新线程的?

java里面不都是这样,开线程要么是new一个thread要么是实现new Runnable接口。。。

#4


我也是新手,我的理解是handler.post是在线程需要用主线程执行代码段时使用,实现与主线程的同步,post下的代码在主线程中执行,不知道对不对

#5


引用 4 楼 fieldisme 的回复:
我也是新手,我的理解是handler.post是在线程需要用主线程执行代码段时使用,实现与主线程的同步,post下的代码在主线程中执行,不知道对不对

找了下资料,原来handler.post还真不是开新线程message.callback.run();最后handler的调用是run方法不是start方法。
但是这样又有一个问题了,post的意义何在?既然不是新线程直接在主线程做这些操作就可以了啊,为啥还弄个post方法?

#6


我的理解是这个post就是和ui线程打交道的快速通道,因为很多时候handler都不是主线程里面,用post就能快速更新UI界面了。

#7


Handler是绑定到创建它的主线程中的,Handler跟UI主线程是同一个线程。Handler的作用:主要是在其他后台线程中,通过handler这个媒介,向UI主线程发送Runnable对象(即代码段)

#8


  textView.setText("alreadly changed");
不能再异步线程里面更新ui界面

#9


handler.post应该是在主线程下执行的 ,不是另外新开线程 我觉得

#10


handler.post应该是在主线程下执行的 

#11


你需要修改handler默认的looper. 

#12


引用 7 楼 linjiafang 的回复:
Handler是绑定到创建它的主线程中的,Handler跟UI主线程是同一个线程。Handler的作用:主要是在其他后台线程中,通过handler这个媒介,向UI主线程发送Runnable对象(即代码段)
这个说的对,,,

#13


看下源码就很清楚了,view.post(Runnable)内部实际还是使用的handler.post(Runnable),而这个方法,内部会执行下面的方法,从而把Runnable设置为Message.callback,实际上相当于handler.sendMessage(),只是发送了一个消息,

private static Message getPostMessage(Runnable r) {
        Message m = Message.obtain();
        m.callback = r;
        return m;
    }


handler.dispatch()的时候,会调用下面的方法
message.callback.run();

就是直接调用的Runnable的run方法,并不是strat(),所以仅仅是当做一个有run()的普通类使用而已,并不是开启了一个新的线程

#14


就是直接调用的Runnable的run方法,并不是strat(),所以仅仅是当做一个有run()的普通类使用而已,并不是开启了一个新的线程,这个我明白,不明白的是他没有启动新的线程,UI线程不会造成阻塞吗。

#15


引用 13 楼 bz419927089 的回复:
看下源码就很清楚了,view.post(Runnable)内部实际还是使用的handler.post(Runnable),而这个方法,内部会执行下面的方法,从而把Runnable设置为Message.callback,实际上相当于handler.sendMessage(),只是发送了一个消息,

private static Message getPostMessage(Runnable r) {
        Message m = Message.obtain();
        m.callback = r;
        return m;
    }


handler.dispatch()的时候,会调用下面的方法
message.callback.run();

就是直接调用的Runnable的run方法,并不是strat(),所以仅仅是当做一个有run()的普通类使用而已,并不是开启了一个新的线程


这位仁兄讲的是最清晰的 赞

#16


Handler类里面有这么一段源码:

/**
     * Handle system messages here.
     */
    public void dispatchMessage(Message msg) {
        if (msg.callback != null) {
            handleCallback(msg);
        } else {
            if (mCallback != null) {
                if (mCallback.handleMessage(msg)) {
                    return;
                }
            }
            handleMessage(msg);
        }
    }


handler在分发消息时,做了判断,看当前message的callback有没有值,如果有则执行给的回调,否则调用具体实现类的handleMessage方法。

那么handler.post(runnable)方法其实也是会创建一个message,让后把message的callback属性值设置为当前方法接收到的runnable参数,而不是开启新线程,不要顾名思义,一定要去看看源码,否则你会被网上很多浅显的分析所误导。

handler.post(runnable)与handler.sendMessage()系列方法区别在于:
用前者的形式时,handler不需要实现handleMessage方法,runnable的类体代替了。
用后者则handler必须实现handleMessage方法,不然怎么处理收到的消息?

#1


handler.post(new Runnable()
        {
            
            @Override
            public void run()
            {
                System.out.println(Looper.myLooper().getThread()+"post");
                textView.setText("alreadly changed");
            }
        });

各位大神求指教啊,new 一个runnable不是开启一个新线程么,为什么在这就不适用了呢。通过打印可以得出还是运行在main线程里面,也能更新UI主键。为啥是这样呢,为啥呢??
我也不知道,帮你顶一下吧。。。

#2


谁告诉你new Runnable()是开新线程的?

#3


引用 2 楼 hjywyj 的回复:
谁告诉你new Runnable()是开新线程的?

java里面不都是这样,开线程要么是new一个thread要么是实现new Runnable接口。。。

#4


我也是新手,我的理解是handler.post是在线程需要用主线程执行代码段时使用,实现与主线程的同步,post下的代码在主线程中执行,不知道对不对

#5


引用 4 楼 fieldisme 的回复:
我也是新手,我的理解是handler.post是在线程需要用主线程执行代码段时使用,实现与主线程的同步,post下的代码在主线程中执行,不知道对不对

找了下资料,原来handler.post还真不是开新线程message.callback.run();最后handler的调用是run方法不是start方法。
但是这样又有一个问题了,post的意义何在?既然不是新线程直接在主线程做这些操作就可以了啊,为啥还弄个post方法?

#6


我的理解是这个post就是和ui线程打交道的快速通道,因为很多时候handler都不是主线程里面,用post就能快速更新UI界面了。

#7


Handler是绑定到创建它的主线程中的,Handler跟UI主线程是同一个线程。Handler的作用:主要是在其他后台线程中,通过handler这个媒介,向UI主线程发送Runnable对象(即代码段)

#8


  textView.setText("alreadly changed");
不能再异步线程里面更新ui界面

#9


handler.post应该是在主线程下执行的 ,不是另外新开线程 我觉得

#10


handler.post应该是在主线程下执行的 

#11


你需要修改handler默认的looper. 

#12


引用 7 楼 linjiafang 的回复:
Handler是绑定到创建它的主线程中的,Handler跟UI主线程是同一个线程。Handler的作用:主要是在其他后台线程中,通过handler这个媒介,向UI主线程发送Runnable对象(即代码段)
这个说的对,,,

#13


看下源码就很清楚了,view.post(Runnable)内部实际还是使用的handler.post(Runnable),而这个方法,内部会执行下面的方法,从而把Runnable设置为Message.callback,实际上相当于handler.sendMessage(),只是发送了一个消息,

private static Message getPostMessage(Runnable r) {
        Message m = Message.obtain();
        m.callback = r;
        return m;
    }


handler.dispatch()的时候,会调用下面的方法
message.callback.run();

就是直接调用的Runnable的run方法,并不是strat(),所以仅仅是当做一个有run()的普通类使用而已,并不是开启了一个新的线程

#14


就是直接调用的Runnable的run方法,并不是strat(),所以仅仅是当做一个有run()的普通类使用而已,并不是开启了一个新的线程,这个我明白,不明白的是他没有启动新的线程,UI线程不会造成阻塞吗。

#15


引用 13 楼 bz419927089 的回复:
看下源码就很清楚了,view.post(Runnable)内部实际还是使用的handler.post(Runnable),而这个方法,内部会执行下面的方法,从而把Runnable设置为Message.callback,实际上相当于handler.sendMessage(),只是发送了一个消息,

private static Message getPostMessage(Runnable r) {
        Message m = Message.obtain();
        m.callback = r;
        return m;
    }


handler.dispatch()的时候,会调用下面的方法
message.callback.run();

就是直接调用的Runnable的run方法,并不是strat(),所以仅仅是当做一个有run()的普通类使用而已,并不是开启了一个新的线程


这位仁兄讲的是最清晰的 赞

#16


Handler类里面有这么一段源码:

/**
     * Handle system messages here.
     */
    public void dispatchMessage(Message msg) {
        if (msg.callback != null) {
            handleCallback(msg);
        } else {
            if (mCallback != null) {
                if (mCallback.handleMessage(msg)) {
                    return;
                }
            }
            handleMessage(msg);
        }
    }


handler在分发消息时,做了判断,看当前message的callback有没有值,如果有则执行给的回调,否则调用具体实现类的handleMessage方法。

那么handler.post(runnable)方法其实也是会创建一个message,让后把message的callback属性值设置为当前方法接收到的runnable参数,而不是开启新线程,不要顾名思义,一定要去看看源码,否则你会被网上很多浅显的分析所误导。

handler.post(runnable)与handler.sendMessage()系列方法区别在于:
用前者的形式时,handler不需要实现handleMessage方法,runnable的类体代替了。
用后者则handler必须实现handleMessage方法,不然怎么处理收到的消息?