我的一个应用程序使用大量HTTP请求与其后端进行通信。 我使用2种不同的实现来执行这些请求:
Volley
AsyncTask
和DefaultHttpClient
的组合大多数时候,一切都运作良好。但有时我会提出一系列网络异常,并将其展示给Crashlytics:
java.net.UnknownHostException: Unable to resolve host "mydomain.com": No address associated with hostname
Caused by: libcore.io.GaiException: getaddrinfo failed: EAI_NODATA (No address associated with hostname)
com.android.volley.ServerError
at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:175)
at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:110)
通过一些研究,我发现,当设备有一个非常糟糕的3g / 4g或者在VPN /子网后面时,它应该会发生,因此无法访问我的网站。
如何确保设备真正连接到互联网? 我实际上只有在此函数返回true时才执行这些请求:
public static boolean isOnline(Context ctx) {
ConnectivityManager cm = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnectedOrConnecting()) {
return true;
}
return false;
}
或者我应该放手,并假设每月达到数百个这样的警告是正常的?
答案 0 :(得分:0)
为了查看您是否有互联网,您需要做的不仅仅是检查您是否有网络连接。因为如果您连接到慢速网络,强制网络门户或VPN,您可以连接到网络,但没有实际的互联网或可用的互联网。
这就是为什么在通过向服务器或Google添加简单的ping之前仍需要检查是否有互联网/可用互联网的原因(因为Google有99,99%的时间用户) 。你也可以定期或当你发现第一个例外时,这取决于你。
public Boolean isInternet() {
try {
Process process = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
int returnVal = process.waitFor();
boolean reachable = (returnVal==0);
return reachable
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
你也可以使用另一种方法,但一般的想法是相同的使用你知道几乎总是在线的东西,并检查你是否可以达到它。
然而,继续处理异常,因为没有办法总是抓住它并且备份处理事情的方式可能会受到伤害
答案 1 :(得分:0)
如何确保设备真正连接到互联网?
你 找到了。这就是错误告诉你的。
如何确保设备真正连接到互联网?我实际上只有在此函数返回true时才执行这些请求:
我不赞成这种事:
一般来说,测试任何资源是否可用的最佳方法就是尝试以正常方式使用它,并在它们出现时处理任何不利后果。
或者我应该放手,并假设每月达到数百个这样的警告是正常的?
我不会说ServerError
是正常的。服务器可能设法通过功能完备的网络将其发送给您,因此可能是您需要调查的服务器或客户端错误。另一方面,网络中断在任何拓扑和技术中都是“正常的”。
答案 2 :(得分:-1)
是的,您应该在发出HTTP请求之前检查互联网可用性,这为您节省了很多。
您应该使用的代码非常好,并且比“ping”任何域都要好得多。
但是在你的情况下,你的情况还不够,因为适配器实际已连接,但由于连接不良,你可能无法连接到你的服务器。
因此,您仍应处理在执行请求时可能发生的超时和IO异常。
- 为你的Httpclient设置超时 - 我认为凌空默认有超时。