NIO selector.select () не работает должным образом при длительном опросе HTTP с Android 2.3? - PullRequest
0 голосов
/ 26 февраля 2011

Я использую кометный стиль общения с моим приложением для Android. Все работало нормально, пока я не использовал Gingerbread (Emulator, CyanogenMod 7). У меня проблема в том, что

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
}

selector.select()>0

вернул true, если я отправил событие с сервера, но теперь оно просто игнорирует его. Точно такой же код работает в Android 1.6 - 2.2

Я думаю, что это ошибка ... кто-то может подтвердить ту же проблему или предоставить обходной путь?

Ответы [ 2 ]

1 голос
/ 26 февраля 2011

Я нашел решение, но не то, почему оно работало раньше.

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

больше не работает.

Мне пришлось зарегистрировать другой селектор, имеющий дело только с OP_READ, и теперь он работает.

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
}

Надеюсь, это избавит от головной боли.

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

Я выложил это как проблему на трекер Android, и это находится в стадии расследования

0 голосов
/ 28 февраля 2011

Я столкнулся с подобной проблемой.Когда я пытаюсь что-то отправить, селектор не выходит из режима блокировки.Поэтому я могу только получать сетевые пакеты и не отправлять их.Я сделаю это и дам вам знать.Я использую Android 2.3.3 на Nexus One.

...