首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android: Selector.select()立即返回0

Android: Selector.select()立即返回0
EN

Stack Overflow用户
提问于 2013-05-05 15:55:16
回答 1查看 1.2K关注 0票数 3

我正在编写一个连接到服务器的安卓应用程序(>= 2.3),我在NIO选择器上遇到了问题。

代码语言:javascript
复制
Selector selector = SelectorProvider.provider().openSelector();
SocketChannel socketChannel = SocketChannel.open();
socketChannel.configureBlocking(false);
socketChannel.register(selector, SelectionKey.OP_READ);

selector.select();  // returns 0 immediately

根据Android文档的说法

公共摘要int select () 在至少准备好一个通道、调用wakeup()或中断调用线程之前,此方法不会返回。

这个案子不属于这些问题,但它又回来了。select()的行为不像规范中描述的那样,我认为这是一个bug。

编辑

我在EJP的评论中更改了代码如下:

代码语言:javascript
复制
socketChannel.register(selector, SelectionKey.OP_CONNECT);
socketChannel.connect(serverAddress);

while (true) {
  selector.select();

  for (SelectionKey key: _selector.selectedKeys()) {
    if (key.isConnectable())
      finishConnect(key);
    ...
  }
  selector.selectedKeys().clear();
}

当服务器运行时,它可以工作: select()返回带有1个选中的键,我可以调用finishConnect()来建立连接。但是,如果服务器没有运行,因此连接被拒绝,select()将返回0选择的键。如果没有选定的键,我就无法决定下一步该做什么。(同样,当select()返回API文档中描述的内容时,这种情况不属于三种类别之一。)

EN

回答 1

Stack Overflow用户

发布于 2013-05-05 21:20:02

在注册之前,尝试将套接字连接到某个地方。要么在将其放入非阻塞模式之前就这样做,要么在之后这样做,但是注册OP_CONNECT而不是OP_READ,并在触发时调用finishConnect():如果它返回true,则取消注册OP_CONNECT并注册OP_READ。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16386342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档