以下是android和ios对runloop的大概实现;
当然android里面不叫runloop,叫looper;
基本都是while循环来处理;
只是android是管理一个消息队列,有任务了就塞到队列里,然后looper再取出来执行;
android 实现
public static final void loop() {
Looper me = myLooper();//从该线程中取出对应的looper对象
MessageQueue queue = me.mQueue;//取消息队列对象...
while (true) {
Message msg = queue.next(); // might block取消息队列中的一个待处理消息..
if (msg != null) {
if (msg.target == null) {
// No target is a magic identifier for the quit message.
return;
}
//处理消息
msg.target.dispatchMessage(msg);
msg.recycle();
}
}
}
IOS 实现
这里删掉了很多其他的代码,只保留了大概逻辑
do {
//do something ......
//处理监听
__CFRunLoopDoObservers(rl, rlm, kCFRunLoopBeforeTimers);
//处理source0 和 source1
__CFRunLoopDoSources0(rl, rlm, stopAfterHandle);
__CFRunLoopDoSource1(rl, rlm, rls, msg, msg->msgh_size, &reply) ;
//处理timer
__CFRunLoopDoTimers(rl, rlm, mach_absolute_time());
} while (0 == retVal);