IO复用-使用NDK提供的Looper

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。但是它方便,易用,
不需要额外的库,在不是太复杂的系统中可以尝试使用。


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值