Классический NIO-клиент:
Create a selector
Register channel to selector for READ WRITE
Loop:
select
iterate selectedKeys
do work for Readable channel and Writeable channel
Я написал простой UDP-NIO-клиент для Android, как описано выше, но находил 30k + HashMapNode выделения памяти каждые 10 секунд.Поскольку канал касался как READ, так и WRITE, вызов select () возвращался немедленно, так как он был доступен для записи, во время каждого select () в HashMap возвращался хотя бы один SelectionKey, возвращаемый SelectedKeys ().Я изменил дизайн, чтобы вначале регистрироваться только для чтения, и вызывал select () с небольшим тайм-аутом (скажем, 10 мс), и если буфер для записи не был пуст, зарегистрируйтесь для записи, выполните записи и зарегистрируйтесь для чтения снова, проблема с выделением памяти исправлена, но операция записи будет отложена, так как вам придется подождать таймаут выбора READ.
Есть ли лучший подход?