我知道Handler是利用Looper实现消息模式的线程编程的。我也知道一个Handler对应一个Looper,默认的Handler所对应的Looper是UI线程的Looper。
HandlerThread可以创建一个新的Looper,并且可以讲Handler与该Looper关联起来。但是这既增加了内存开销(我在DDMS上看到HandlerThread下有很多子线程,比如MessageQueue和Looper等),又增加了处理开销(多线程并行)。我写过测试代码,Runnable在HandlerThread中处理比在UI线程中处理要慢3倍!
那么我们为什么需要HandlerThread呢?或者说新开一个消息队列的Looper有什么好处呢?
另外通过runOnUiThread方式实现多线程是否比Handler高效?因为这种方式的多线程没有Looper和MessageQueue。求牛人们指点指点。PS:我javaeye没积分了。javaeye的积分真恶心,难挣啊,提了4次问题还没人鸟我。火了,我以后在csdn提问题。
HandlerThread可以创建一个新的Looper,并且可以讲Handler与该Looper关联起来。但是这既增加了内存开销(我在DDMS上看到HandlerThread下有很多子线程,比如MessageQueue和Looper等),又增加了处理开销(多线程并行)。我写过测试代码,Runnable在HandlerThread中处理比在UI线程中处理要慢3倍!
那么我们为什么需要HandlerThread呢?或者说新开一个消息队列的Looper有什么好处呢?
另外通过runOnUiThread方式实现多线程是否比Handler高效?因为这种方式的多线程没有Looper和MessageQueue。求牛人们指点指点。PS:我javaeye没积分了。javaeye的积分真恶心,难挣啊,提了4次问题还没人鸟我。火了,我以后在csdn提问题。
解决方案 »
- 设置 ListActivity的setEmptyView()
- Android4.1 GMS包哪有下载?
- android:如何做到点击链接,自己的程序可以响应?
- 小白问题
- Android程序中嵌入WebView,单击其中的链接时无反应,请问是什么原因引起的?如何解决?
- 求指导:mina做服务端,客户端怎么做更好?mina发送的消息如何解析?
- 不知道什么原因Activity的onSaveInstanceState未被调用,达人帮忙啊!!
- phonegap初始化太慢,操作中反应也慢,何解?
- SimpleCursorAdapter 报错求各位帮忙看下
- 安卓开发使用的语言和java语言是什么关系?
- Path类是干嘛的,有谁给讲一下吗?API原文看不懂
- android的service和UI线程同线程,那为什么不直接把代码写在activity中
一般对于所有的线程,都是有一个大循环,循环里面收message,然后根据收到的message,处理响应的命令android只不过把这些抽象出来几个类而已:
大循环是looper,消息就是messagequeue,处理过程就是handler
主线程由于ANR的限制,一般要做稍微复杂些的东西,都要一个辅助的线程来处理的。
ameyui朋友你说的对,这个我知道。但是实现线程除了Handler还有其他一些方式。AsycnTask我就很喜欢我写下面的代码:runOnUIThread(
new Runnable()
{
public void run()
{
new Thread(){
public void run()
{
//do something
}
}.start();
}
}
)不是也新开了一个辅助线程?我在DDMS里看了,的确是新线程。但是为什么这个方法是runOnUIThread(),好诡异啊。
Handler跟一个线程和该线程对应的消息队列绑定,它可以往这个消息队列发送消息或者响应该队列的消息;
runOnUiThread()是让将要执行的代码放到一个UI线程里面去执行,如果当前线程是UI线程,代码将立即执行;如果当前线程不是UI线程,则将要执行的操作发送到UI线程的消息队列里,等待执行。针对android ANR问题,一般是因为在主线程里执行了长时间的计算,或者复杂的UI呈现。
因此,可以使用HandlerThread执行复杂的计算,使用runOnUiThread()执行UI操作。Handler只不过是用来在不同线程间通信的机制。
实际发行,有时候使用HandlerThread还不一定能解决ANR问题,这时候还是得使用Thread了。
当我们需要一个工作者线程,而不是把它当作一次性消耗品,用过即废弃的话,就可以使用它。Handler在android里负责发送和处理消息。它的主要用途有:
1)按计划发送消息或执行某个Runnanble(使用POST方法);
2)从其他线程中发送来的消息放入消息队列中,避免线程冲突(常见于更新UI线程)
默认情况下,Handler接受的是当前线程下的消息循环实例(使用Handler(Looper looper)、Handler(Looper looper, Handler.Callback callback) 可以指定线程),同时一个消息队列可以被当前线程中的多个对象进行分发、处理(在UI线程中,系统已经有一个Activity来处理了,你可以再起若干个 Handler来处理)。在实例化Handler的时候,Looper可以是任意线程的,只要有Handler的指针,任何线程也都可以 sendMessage。Handler对于Message的处理不是并发的。一个Looper 只有处理完一条Message才会读取下一条,所以消息的处理是阻塞形式的(handleMessage()方法里不应该有耗时操作,可以将耗时操作放在 其他线程执行,操作完后发送Message(通过sendMessges方法),然后由handleMessage()更新UI)。