返回信息流关于Looper我有一点疑问。Looper的loop()方法会一直循环的从消息队列中取出消息,如果没有消息则会进入阻塞,等待消息的到来。这一过程是在哪个线程进行的呢?如果是在主线程中运行的话,那岂不是主线程一直在阻塞?如果不是在主线程中运行的话,那后面的dispatchMessage()和handler的handlerMessage()又怎么会运行在主线程呢?
望知道的大神帮忙解惑![ema0][ema0][ema0]
这是一条镜像帖。来源:北邮人论坛 / mobile-terminal-at / #29149同步于 2016/3/14
该镜像源已超过 30 天没有更新,可能在源站已被删除。
MobileTerminalAT机器人发帖
关于Looper的一个疑问
ljcmeng
2016/3/14镜像同步13 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
看 ActiivtyThread.java 的 main 方法的最后几行:
// End of event ActivityThreadMain.
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
Looper是在主线程中运行的,当需要改变UI时通过Handler发送消息,即将message插入MessageQueue ,然后looper取出message,调用handlerMessage()从而达到在主线程中改变UI的目的。当没有message时looper就等着呗,如果Looper.loop()跳出来了,主线程不就完了,那就得抛异常了。
其实楼主想解决的问题是两个:
1、looper是不是在主线程运行的? 按照@aname的说法,是的。
那么我们知道主线程跑耗时程序会卡,那么looper阻塞了为什么不会卡住?
我想这是因为looper就是这么特殊,它卡住了没关系,因为他卡住的时候代表并没有任何UI需要更新,这样的话在UI上就表现不出来卡住。有UI更新了,他就运行。 其他的代码如果在主线程运行导致looper卡住,才会表现为程序卡住。
不知道是不是这个意思。
嗯,还是你说的比较清楚,lz说的阻塞应该说的是UI的阻塞
【 在 icyfox (【意涵团】狐狸|熊爸|HUKOU!) 的大作中提到: 】
: 其实楼主想解决的问题是两个:
: 1、looper是不是在主线程运行的? 按照@aname的说法,是的。
: ...................
不是做安卓的,我猜是looper中维护了一个任务队列,looper所在的线程一直去任务队列中取出任务,而在别的线程中调用handler的handlerMessage()应该只是将任务放到looper的任务队列中,真正执行的线程还是looper所在线程呗
对,线程维护了一个MessageQueue,Looper不断从这个Queue中取得Message,
Message中有个target变量,是Handler类型,通过target找到这个Handler,执行这个Handler的handleMessage方法。
【 在 LNAmp 的大作中提到: 】
: 不是做安卓的,我猜是looper中维护了一个任务队列,looper所在的线程一直去任务队列中取出任务,而在别的线程中调用handler的handlerMessage()应该只是将任务放到looper的任务队列中,真正执行的线程还是looper所在线程呗
但是在源码里面就是一个for循环,并没有很多特殊的地方啊···
我觉得LZ的意思是为什么这个一直在for循环里面,但是主线程还是可以做很多其他的事情,怎么能做到做其他事情的····
【 在 icyfox 的大作中提到: 】
: 其实楼主想解决的问题是两个:
: 1、looper是不是在主线程运行的? 按照@aname的说法,是的。
: 那么我们知道主线程跑耗时程序会卡,那么looper阻塞了为什么不会卡住?
: ...................
他,就是,主线程,主线程就是他。
【 在 hailixiansen (Mr.NANA) 的大作中提到: 】
: 但是在源码里面就是一个for循环,并没有很多特殊的地方啊···
: 我觉得LZ的意思是为什么这个一直在for循环里面,但是主线程还是可以做很多其他的事情,怎么能做到做其他事情的····