IO复用-使用NDK提供的Looper

来源:互联网 发布:淘宝新店铺 购买 编辑:程序博客网 时间:2024/06/05 09:48
android NDK提供了对linux epoll 的封装API,头文件在android/looper.h ,
其封装的实现代码在(android4.3):
android-4.3/frameworks/base/native/android/looper.cpp 和
android-4.3/frameworks/native/libs/utils/Looper.cpp
android/looper.h 中有几个比较重要的函数:

typedef int (*ALooper_callbackFunc)(int fd, int events, void* data);
回调函数类型,返回1表示继续监听fd,返回0表示将fd删除,不再监听
int ALooper_addFd(ALooper* looper, int fd, int ident, int events, ALooper_callbackFunc callback, void* data);
添加fd到looper以便可以进行监听,具体参数含义可以查看头文件
int ALooper_pollOnce(int timeoutMillis, int* outFd, int* outEvents, void** outData);开始监听addFd加进来的fd事件,用法请查看头文件
用法案例 :
int onEvent(int fd, int events, void* da){Server *sv=(Server*)da;return sv->handleEvent(fd, events, da);   //分发处理事件}void Server::runLoop(){setnonblock(socket_fd);  //设置为非阻塞setnonblock(broadcast_fd);looper=ALooper_prepare(0); ALooper_acquire(looper);        ALooper_addFd(looper,socket_fd,0,events,(ALooper_callbackFunc)&onEvent,this);             ALooper_addFd(looper,broadcast_fd,0,events,(ALooper_callbackFunc)&onEvent,this);        ............        ............   pollTimeout=-1;  //-1永不超时exit_flag=0;running=1;while(true){int result=ALooper_pollOnce(pollTimeout,NULL,NULL,NULL);if(result== ALOOPER_POLL_ERROR){ //发生错误break;}if(result==ALOOPER_POLL_TIMEOUT)  //等待超时{doSomething();}if(exit_flag)break;}ALooper_removeFd(looper,broadcast_fd);       ALooper_removeFd(looper,socket_fd);       ALooper_release(looper); running=0;}
相对于libevent,libuv库,NDK提供的API功能显然弱不少,且只能为用epoll。但是它方便,易用,
不需要额外的库,在不是太复杂的系统中可以尝试使用。
0 1
原创粉丝点击