在Android NDK中,
ALooper_pollOnce()
和ALooper_pollAll()
有什么区别?
这些简单的指定要从 Looper 的事件队列处理多少(最大)回调。顾名思义,
pollAll()
执行事件队列中的所有回调,直到遇到数据事件、错误或超时。另一方面,一旦执行第一个回调,pollOnce()
就会返回 ALOOPER_POLL_CALLBACK。
基本上,他们的关系可以用下面的伪代码来表达:
int ALooper_pollAll(int timeoutMillis, int* outFd, int* outEvents, void** outData) {
int result;
do {
result = ALooper_pollOnce(timeoutMillis, outFd, outEvents, outData);
} while (result == ALOOPER_POLL_CALLBACK);
return result;
}
ALooper_pollAll
(事实上,它目前在 AOSP 中被标记为已删除,因此很快就无法调用)。 ALooper_pollAll
中存在一个错误,这意味着它可能无法响应 ALooper_wake
。这些问题的详细解释见https://github.com/android/ndk/discussions/2020。
两者之间的预期区别是
ALooper_pollAll
不会将控制权返回给调用者,直到它收到回调未处理的事件(例如未注册回调的合法事件、错误或显式唤醒) ),而 ALooper_pollOnce
将在处理第一个事件、回调或其他事件后返回。