Предварительные условия: эмулятор Android 2.2.
У меня есть прекрасно работающий код Java, который также отлично скомпилирован для Android.Но наступает странная часть.В частности, кажется, что java.nio.Selector не работает вообще.
Первая проблема возникает при подключении.Следующий код работает на Java, но не работает на Android (подробности см. Ниже).
socketChannel.configureBlocking(false);
socketChannel.connect(new InetSocketAddress(remoteAddr, getRemotePort()));
Selector selector = Selector.open();
socketChannel.register(selector, socketChannel.validOps());
// Wait for an event
int selRes = selector.select(timeout);
if (selRes == 1)
{
SelectionKey selKey = (SelectionKey)selector.selectedKeys().iterator().next();
if (selKey.isValid() && selKey.isConnectable()) {
// Get channel with connection request
boolean success = socketChannel.finishConnect();
if (!success) {
selKey.cancel();
}
}
}
Я передаю тайм-аут 30000 (мс, что составляет 30 секунд), но select немедленно возвращает значение selres, равное 0 (в Desktop Java это 1).Переключение сокета в режим блокировки работает нормально (так что адреса, порты и другие вещи в порядке).
Хорошо, я оставил соединение для блокировки (пока).Но теперь мой Accept перестал работать - Selector не сообщает о входящих соединениях.Опять же, избавление от Selector с помощью блокирующего сокета работает.
Итак, вопрос в том, работает ли вообще Selector в Android, или код следует переписать, чтобы вообще избежать Selector и java.nio?