开发者

NIO selector.select() not working properly on long poll HTTP since Android 2.3?

开发者 https://www.devze.com 2023-02-13 19:39 出处:网络
I use comet style communication with my android app. It worked all fine until I used Gingerbread (Emulator, CyanogenMod 7). The problem I have is that

I use comet style communication with my android app. It worked all fine until I used Gingerbread (Emulator, CyanogenMod 7). The problem I have is that

Selector selector = Selector.open();
channel.configureBlocking(false);
channel.connect(socketAddress);
channel.socket().setKeepAlive(true);
channel.register(selector, SelectionKey.OP_CONNECT | SelectionKey.OP_READ);

if(selector.select() > 0){
 //DO STUFF
}

the

selector.select()>0

returned true if I sent an event from the server but now it just ignores it. Exactly the same code w开发者_StackOverflow中文版orks in Android 1.6 - 2.2

I think this is a bug... someone can confirm the same issue or provide a workaround?


i found the solution, but not why it worked before.

channel.register(selector, SelectionKey.OP_CONNECT | SelectionKey.OP_READ);

does not work anymore.

I had to register another selector only dealing with OP_READ and now it works.

channel.register(readSelector, SelectionKey.OP_READ);
channel.register(connectSelector, SelectionKey.OP_CONNECT);

if(connectSelector.select() > 0){
   //Do connect stuff
} else if(readSelector.select() > 0){
   //Do read stuff
}

I hope this saves some headaches.

EDIT: http://code.google.com/p/android/issues/detail?id=15055

I posted it as a issue on the android issuetracker and it is under investigation


I have run into a similar issue. When I try to send something the selector does not get out of the blocking mode. So I can only recieve the network packets and not send any. I will give this a shot and let you know. I am running android 2.3.3 on a nexus one.

0

精彩评论

暂无评论...
验证码 换一张
取 消