android中线程的handler能不能更新Activity的UI组件?

iamxxyu 2014-05-08 09:10:29
新人刚开始学android开发,看到handler这一章。知道可以在主线程(UI线程)的handler中接受其他线程的信息来更新Activity的UI,想到了一个疑问,handler是可以在一个线程(非主线程)里面声明的,那么这个handler就是属于这个线程(非主线程)的了,那这个线程的handler可以用来更新Activity的UI吗?(我是看到一句话说Activity只运行主线程来来修改UI组件的,联系起来就有这个疑问)。。。。如果问题本身的描述就是存在理解的误区的话请指出。。谢谢!
...全文
297 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
小豆子0722 2015-11-30
  • 打赏
  • 举报
回复
引用 6 楼 z420770023 的回复:
[quote=引用 4 楼 zhenweiyu 的回复:] [quote=引用 3 楼 z420770023 的回复:] 就想你说的Handler可以在线程中声明,实际上Handler依赖于当前线程中messageQueue和Looper(每个线程可以且只能有一个),也就是说你在非UI线程中构造的Handler,它的循环和事件处理仍然是在当前线程中执行的,不能更新UI。 可以找些Handler原理文章看看
嗯··我这两天做了个DEMO试验了,当我把一个handler放在一个线程里面声明的时候。例如 class ChangePicture extends Thread { public Handler mHandler; public void run() { Looper.prepare(); mHandler=new Handler() { public void handleMessage(Message msg) { if(msg.what==0x123) { 更新UI操作 } } } }; Looper.loop(); } } 程序是真的跑不了的,一直是进程错误自动闪退的; 而当我把这个handler放在了主线程里面,就真的是可以更新UI而没有报错了; 那换句话说,是不是可以肯定的得出结论:要更新UI的话,对应的handler只能在主线程里面?[/quote] 是的,需要更新UI就需要在主线程里构造handler,并传递给子线程,在非UI线程里构造Handler的意义就只在于异步消息通知了,可以用在回调处理的地方[/quote] 请问有什么好方法把主线程的handler传递给子线程
逍遥笑 2014-05-13
  • 打赏
  • 举报
回复
将handler声明为全局变量,在线程中需要发送message的时候,直接就使用handler发送message,然后在外面处理就可以更新UI线程了
iamxxyu 2014-05-13
  • 打赏
  • 举报
回复
引用 3 楼 z420770023 的回复:
就想你说的Handler可以在线程中声明,实际上Handler依赖于当前线程中messageQueue和Looper(每个线程可以且只能有一个),也就是说你在非UI线程中构造的Handler,它的循环和事件处理仍然是在当前线程中执行的,不能更新UI。 可以找些Handler原理文章看看
嗯··我这两天做了个DEMO试验了,当我把一个handler放在一个线程里面声明的时候。例如 class ChangePicture extends Thread { public Handler mHandler; public void run() { Looper.prepare(); mHandler=new Handler() { public void handleMessage(Message msg) { if(msg.what==0x123) { 更新UI操作 } } } }; Looper.loop(); } } 程序是真的跑不了的,一直是进程错误自动闪退的; 而当我把这个handler放在了主线程里面,就真的是可以更新UI而没有报错了; 那换句话说,是不是可以肯定的得出结论:要更新UI的话,对应的handler只能在主线程里面?
zhoujh27 2014-05-13
  • 打赏
  • 举报
回复
引用 4 楼 zhenweiyu 的回复:
[quote=引用 3 楼 z420770023 的回复:] 就想你说的Handler可以在线程中声明,实际上Handler依赖于当前线程中messageQueue和Looper(每个线程可以且只能有一个),也就是说你在非UI线程中构造的Handler,它的循环和事件处理仍然是在当前线程中执行的,不能更新UI。 可以找些Handler原理文章看看
嗯··我这两天做了个DEMO试验了,当我把一个handler放在一个线程里面声明的时候。例如 class ChangePicture extends Thread { public Handler mHandler; public void run() { Looper.prepare(); mHandler=new Handler() { public void handleMessage(Message msg) { if(msg.what==0x123) { 更新UI操作 } } } }; Looper.loop(); } } 程序是真的跑不了的,一直是进程错误自动闪退的; 而当我把这个handler放在了主线程里面,就真的是可以更新UI而没有报错了; 那换句话说,是不是可以肯定的得出结论:要更新UI的话,对应的handler只能在主线程里面?[/quote] 是的,需要更新UI就需要在主线程里构造handler,并传递给子线程,在非UI线程里构造Handler的意义就只在于异步消息通知了,可以用在回调处理的地方
zhoujh27 2014-05-12
  • 打赏
  • 举报
回复
就想你说的Handler可以在线程中声明,实际上Handler依赖于当前线程中messageQueue和Looper(每个线程可以且只能有一个),也就是说你在非UI线程中构造的Handler,它的循环和事件处理仍然是在当前线程中执行的,不能更新UI。 可以找些Handler原理文章看看
  • 打赏
  • 举报
回复
handler不是属于某个子线程的,而是全局的。你子线程是发送消息给handler,通知他去更新ui
十三邵 2014-05-09
  • 打赏
  • 举报
回复
新人刚开始学android开发,看到handler这一章。知道可以在主线程(UI线程)的handler中接受其他线程的信息来更新Activity的UI,想到了一个疑问,handler是可以在一个线程(非主线程)里面声明的,那么这个handler就是属于这个线程(非主线程)的了,那这个线程的handler可以用来更新Activity的UI吗?(我是看到一句话说Activity只运行主线程来来修改UI组件的,联系起来就有这个疑问)。。。。如果问题本身的描述就是存在理解的误区的话请指出。。谢谢!、 我也不会,帮你顶一下。。。话说,自己试验一下就知道了。。。

80,349

社区成员

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

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