我有一个 AsyncTask
应该检查对主机名的网络访问。但是 doInBackground()
永远不会超时。有人知道吗?
public class HostAvailabilityTask extends AsyncTask<String, Void, Boolean> {
private Main main;
public HostAvailabilityTask(Main main) {
this.main = main;
}
protected Boolean doInBackground(String... params) {
Main.Log("doInBackground() isHostAvailable():"+params[0]);
try {
return InetAddress.getByName(params[0]).isReachable(30);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
protected void onPostExecute(Boolean... result) {
Main.Log("onPostExecute()");
if(result[0] == false) {
main.setContentView(R.layout.splash);
return;
}
main.continueAfterHostCheck();
}
}
原文由 Vidar Vestnes 发布,翻译遵循 CC BY-SA 4.0 许可协议
网络连接/互联网访问
isConnectedOrConnecting()
(在大多数答案中使用)检查任何 网络 连接A)Ping 服务器(简单)
+
可以在主线程上运行-
不适用于某些旧设备(Galays S3 等),如果没有互联网可用,它会阻塞一段时间。B) 连接到 Internet 上的套接字(高级)
+
非常快(无论哪种方式),适用于所有设备, 非常 可靠-
无法在 UI 线程上运行这在每台设备上都非常可靠,而且速度非常快。它需要在单独的任务中运行(例如
ScheduledExecutorService
或AsyncTask
)。可能的问题
是的,非常快 ;-)
据我所知,但请告诉我,我会编辑我的答案。
Google DNS(例如
8.8.8.8
)是世界上最大的公共 DNS。截至 2018 年,它每天处理超过一万亿个查询 [ 1 ]。这么说吧,您的应用程序可能不会成为今天的话题。只是互联网访问 - 惊喜 ^^(顺便说一句,你有没有想过,如果没有这个许可,这里建议的一些方法甚至可以远程连接互联网访问?)
额外:一次性
RxJava/RxAndroid
示例 (Kotlin)额外:一次性
RxJava/RxAndroid
示例(Java)额外:一次性
AsyncTask
示例注意: 这显示了如何执行请求的另一个示例。然而,由于
AsyncTask
已被弃用,它应该被你的应用程序的线程调度、Kotlin Coroutines、Rx、…