handler.post运行线程

yangsong551 2014-05-13 09:09:19
handler.post(new Runnable()
{

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

各位大神求指教啊,new 一个runnable不是开启一个新线程么,为什么在这就不适用了呢。通过打印可以得出还是运行在main线程里面,也能更新UI主键。为啥是这样呢,为啥呢??
...全文
1492 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_24550371 2016-05-09
  • 打赏
  • 举报
回复
引用 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()的普通类使用而已,并不是开启了一个新的线程
这位仁兄讲的是最清晰的 赞
wj037 2015-12-29
  • 打赏
  • 举报
回复
就是直接调用的Runnable的run方法,并不是strat(),所以仅仅是当做一个有run()的普通类使用而已,并不是开启了一个新的线程,这个我明白,不明白的是他没有启动新的线程,UI线程不会造成阻塞吗。
赵凯强 2015-10-11
  • 打赏
  • 举报
回复
看下源码就很清楚了,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()的普通类使用而已,并不是开启了一个新的线程
无傷 2014-05-13
  • 打赏
  • 举报
回复
textView.setText("alreadly changed"); 不能再异步线程里面更新ui界面
Jayfon 2014-05-13
  • 打赏
  • 举报
回复
Handler是绑定到创建它的主线程中的,Handler跟UI主线程是同一个线程。Handler的作用:主要是在其他后台线程中,通过handler这个媒介,向UI主线程发送Runnable对象(即代码段)
yangsong551 2014-05-13
  • 打赏
  • 举报
回复
我的理解是这个post就是和ui线程打交道的快速通道,因为很多时候handler都不是主线程里面,用post就能快速更新UI界面了。
yangsong551 2014-05-13
  • 打赏
  • 举报
回复
引用 4 楼 fieldisme 的回复:
我也是新手,我的理解是handler.post是在线程需要用主线程执行代码段时使用,实现与主线程的同步,post下的代码在主线程中执行,不知道对不对
找了下资料,原来handler.post还真不是开新线程message.callback.run();最后handler的调用是run方法不是start方法。 但是这样又有一个问题了,post的意义何在?既然不是新线程直接在主线程做这些操作就可以了啊,为啥还弄个post方法?
fieldisme 2014-05-13
  • 打赏
  • 举报
回复
我也是新手,我的理解是handler.post是在线程需要用主线程执行代码段时使用,实现与主线程的同步,post下的代码在主线程中执行,不知道对不对
yangsong551 2014-05-13
  • 打赏
  • 举报
回复
引用 2 楼 hjywyj 的回复:
谁告诉你new Runnable()是开新线程的?
java里面不都是这样,开线程要么是new一个thread要么是实现new Runnable接口。。。
  • 打赏
  • 举报
回复
谁告诉你new Runnable()是开新线程的?
十三邵 2014-05-13
  • 打赏
  • 举报
回复
handler.post(new Runnable() { @Override public void run() { System.out.println(Looper.myLooper().getThread()+"post"); textView.setText("alreadly changed"); } }); 各位大神求指教啊,new 一个runnable不是开启一个新线程么,为什么在这就不适用了呢。通过打印可以得出还是运行在main线程里面,也能更新UI主键。为啥是这样呢,为啥呢?? 我也不知道,帮你顶一下吧。。。
哎,真难 2014-05-13
  • 打赏
  • 举报
回复
引用 7 楼 linjiafang 的回复:
Handler是绑定到创建它的主线程中的,Handler跟UI主线程是同一个线程。Handler的作用:主要是在其他后台线程中,通过handler这个媒介,向UI主线程发送Runnable对象(即代码段)
这个说的对,,,
凉凉二点凉 2014-05-13
  • 打赏
  • 举报
回复
你需要修改handler默认的looper.
唯你Only 2014-05-13
  • 打赏
  • 举报
回复
handler.post应该是在主线程下执行的
Mr_叶 2014-05-13
  • 打赏
  • 举报
回复
handler.post应该是在主线程下执行的 ,不是另外新开线程 我觉得

80,465

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧