初学Android,不理解Handler和线程有什么区别,求教 昨天刚看了Handler和HandlerThread这个东西,不明白为什么要用这么复杂的东西,而且Handler直接post的话好像还不是子线程运行。那我再开发的时候直接用Thread行不行?两个有什么区别? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 个人理解handler就是把thread封装了一下,自己实现也可以,但是自己要实现消息传递机制如果不对,楼下的correct me Handler是可以实现线程间通信的,LZ知道Android的UI线程不安全的吧,也就是说不可以在UI线程以外的其他线程对UI进行更新设置操作,但是有时候又不能再UI主线程进行一些耗时操作,那样UI会响应很迟钝的,这时候就会新开一个线程,新开的线程可以通过Handler来把处理的结果由消息传回UI主线程,在UI主线程里进行相关的UI更新等等~ Handler就是android中一个机制,主要是考虑到线程安全的! 还是有些不明白,意思是如果我自己写一个线程,把UI传进去,那再新线程中是不能操作UI的?另外,如果我不操作UI,只是做一些其他的后台操作,能否用Thread而不用Android提供的Handler? 1。新线程是不能操作UI主线程的2. 如果不操作UI,可以只用Thread 如果你在UI中起了线程,这时你在线程中做完某些处理后想进行UI的操作(如:更新界面),这时,你有两种方法。1,在线程中直接调用UI中的方法来更新UI,这时会报错,因为Android是非线程安全的,因为子线程在更新UI的同时主线程也可能在更新UI,这样的话因为是非线程安全因此可能会出错,所以Android规定不可在子线程中执行更新UI的操作。2,子线程可以发送消息(sendMessage)给主线程,由主线程自己更新自己,这就用到Android的Handler消息管理机制了。具体Handler的用法网上很多。当然如果线程中没有UI操作那就不需要发送什么消息给主线程了。与Handler完成相同功能的还有AsyncTask,是Android提供的一个异步类,它在执行完线程操作后会直接跳回主线程,用法网上很多。 纯个人感觉,THREAD一般都是和UI没联系的,HANDLER我个人感觉就是一个桥梁,THREAD读出数据然后send一个message给handler来实现和UI的交互 我也这么认为,不过感觉还是Thread好用,起码学到现在为止感觉还是会使用Thread,可能学习的不够深吧 我原来学的时候啥线程都不会,后来做android一次读大量图片直接把我搞得离死不远了……现在碰见个东西就想线程…… handler post仍然是在ui线程中启动,没有启到多线程的作用。你要使用多线程可以直接用Thread 然后thread.start但是HandlerThread是重新启动线程和handler不一样,可以说和thread起到同样的功能 当你需要做一些比较耗时的动作时,为了防止UI卡住,就要新开一个线程来做.情况1:如果线程里面不需要更改UI,那就随意了.情况2:如果线程里面需要更改UI,那就要用到handler,利用handler传送消息. 我的理解:理解Handler最好是要结合Looper和MessageQueue。handler的发送message和task只是往某一个looper的MessageQueue注入一项。Looper是和thread结合的,就是一个事件循环。当该线程回到其事件循环时,之前注入的项就会得到执行。至于在哪个线程里执行,要看handler发送到哪个线程的looper了,创建handler时都会绑定一个looper(ui线程是自动绑定的),handler发送的message等都会在该looper的线程得到处理。如果你有Qt的开发经验就很容易理解,这跟Qt的信号槽几乎是如出一辙。 http://blog.csdn.net/androidbluetooth/article/details/6384641不是很复杂,推荐你看看上面一篇文章。 如果你不需要跟UI线程进行交互的话是可以用thread的啦~ 解释的不错,在我使用当中handler主要是对message发送,接受和处理。不仅仅本身的message,有时候还是其他线程的message。 同一个工程,同一个package下面的java文件是否自动相互引用? 求助,谁做过Android Camera 对比度 尖锐度 饱和度这几个参数的设置? 源码Hello Views问题 仿天天动听布局疑问 这个该怎么做呢? andriod service 监听按键事件 服务器客户端分时传递字符串和文件 android 应用的图标如何实现程序动态改变? 使用友推分享sdk时遇到一些问题,求大神帮忙 【FlowDroid】使用FlowDroid绘制apk函数调用图遇到的问题 如何调用系统gallery打开指定文件夹中的图片 VideoView 显示问题。
如果不对,楼下的correct me
还是有些不明白,意思是如果我自己写一个线程,把UI传进去,那再新线程中是不能操作UI的?
另外,如果我不操作UI,只是做一些其他的后台操作,能否用Thread而不用Android提供的Handler?
2. 如果不操作UI,可以只用Thread
1,在线程中直接调用UI中的方法来更新UI,这时会报错,因为Android是非线程安全的,因为子线程在更新UI的同时主线程也可能在更新UI,这样的话因为是非线程安全因此可能会出错,所以Android规定不可在子线程中执行更新UI的操作。
2,子线程可以发送消息(sendMessage)给主线程,由主线程自己更新自己,这就用到Android的Handler消息管理机制了。具体Handler的用法网上很多。
当然如果线程中没有UI操作那就不需要发送什么消息给主线程了。
与Handler完成相同功能的还有AsyncTask,是Android提供的一个异步类,它在执行完线程操作后会直接跳回主线程,用法网上很多。
你要使用多线程可以直接用Thread 然后thread.start
但是HandlerThread是重新启动线程和handler不一样,可以说和thread起到同样的功能
情况2:如果线程里面需要更改UI,那就要用到handler,利用handler传送消息.
理解Handler最好是要结合Looper和MessageQueue。
handler的发送message和task只是往某一个looper的MessageQueue注入一项。
Looper是和thread结合的,就是一个事件循环。当该线程回到其事件循环时,之前注入的项就会得到执行。
至于在哪个线程里执行,要看handler发送到哪个线程的looper了,创建handler时都会绑定一个looper(ui线程是自动绑定的),handler发送的message等都会在该looper的线程得到处理。
如果你有Qt的开发经验就很容易理解,这跟Qt的信号槽几乎是如出一辙。
如果你不需要跟UI线程进行交互的话是可以用thread的啦~