Android DNS需要热身吗?

How*_*ard 6 dns android android-networking

从旧的帖子如Android java.net.UnknownHostException:Host未解析(策略问题),它建议使用以下代码:

  try {
      InetAddress i = InetAddress.getByName(URLName);
    } catch (UnknownHostException e1) {
      e1.printStackTrace();
    }
Run Code Online (Sandbox Code Playgroud)

那么这意味着当DNS条目没有被缓存在设备中时,例如在启动之后,它将java.net.UnknownHostException: Host第一次返回,即使对于有效的DNS也是如此?

Яро*_*лин 3

这取决于安卓版本。

如果您有 Internet 连接,并且您的应用程序在清单文件中声明它需要 Internet 访问,那么该地址应该可以正常解析。

http://developer.android.com/reference/java/net/InetAddress.html

在 Android 4.0(冰淇淋三明治)及更早版本中,DNS 缓存由
InetAddress 和 C 库,这意味着无法遵守 DNS TTL
正确。在后续版本中,缓存仅由 C 库和 DNS TTL 完成
很荣幸。

因此,如果您请求的地址不早于生存时间,缓存就会回答。如果它不在缓存中或已过期,则操作系统将尝试通过 DNS 服务器来查找它。仅当您的 Internet 连接未启动或没有 DNS 响应时才会引发异常,而不是当缓存请求失败时引发异常。

也就是说,如果您正在为较旧的 Android 编写应用程序,那么这个问题可能仍然困扰着您。

有办法处理:
Android: Flush DNS