ErrnoException:isConnected失败:EHOSTUNREACH(没有路由到主机)使用ICS更改WiFi网络时

ErrnoException:isConnected失败:EHOSTUNREACH(没有路由到主机)使用ICS更改WiFi网络时

问题描述:

使用我的应用程序时,将我的wifi网络从networkA更改为networkB后,所有对图像的请求都会返回异常。ErrnoException:isConnected失败:EHOSTUNREACH(没有路由到主机)使用ICS更改WiFi网络时

失败,异常

> org.apache.http.conn.HttpHostConnectException: Connection to 
> https://m1.testapp.com refused at 
> org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:183) 
> at 
> org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
> at 
> org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
> at 
> org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 
> at 
> org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
> at 
> org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
> at 
> org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
> at 
> com.testApp.android.ws.PooledRequestProcessor$Runner.run(PooledRequestProcessor.java:298) 
> at 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
> at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
> at java.lang.Thread.run(Thread.java:856) Caused by: 
> java.net.ConnectException: failed to connect to /109.233.153.38 (port 
> 443) after 20000ms: isConnected failed: EHOSTUNREACH (No route to 
> host)  at 
> org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:181) 
> ... 10 more Caused by: java.net.SocketException: failed to connect 
> to /109.233.153.38 (port 443) after 20000ms: isConnected failed: 
> EHOSTUNREACH (No route to host) at 
> libcore.io.IoBridge.isConnected(IoBridge.java:220) at 
> libcore.io.IoBridge.connectErrno(IoBridge.java:152) at 
> libcore.io.IoBridge.connect(IoBridge.java:112) at 
> java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) at 
> java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459) at 
> java.net.Socket.connect(Socket.java:842)  at 
> org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119) 
> at 
> org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144) 
> ... 10 more Caused by: libcore.io.ErrnoException: isConnected 
> failed: EHOSTUNREACH (No route to host) at 
> libcore.io.IoBridge.isConnected(IoBridge.java:201) 

最奇怪的是,即使卸载应用程序,并重新安装它不会修复它,只是把手机关机再打开。

我在这里看到类似的问题http://groups.google.com/group/newsrob/browse_thread/thread/ea2f26d9d1753b79/5800e268eeab399c#5800e268eeab399c。这个问题在4.0.3手机上没有发生,只是在4.0.1手机上,而且更新似乎还没有在欧洲上市。

也许需要一段时间才能切换到某个原因?在发出请求之前,您可以检查是否存在活动的网络连接:

ConnectivityManager connectivityManager = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); 
NetworkInfo networkInfo     = connectivityManager.getActiveNetworkInfo(); 

if (networkInfo != null && networkInfo.isConnected() && networkInfo.isAvailable()) 
{ 
    // DO WHAT YOU NEED TO DO ON THE NETWORK 
} 
else 
{ 
    // PROMPT USER THAT NETWORK IS DISCONNECTED 

     Toast.makeText(this, "There is no active network connection!", 5000).show(); 
} 

使用新网络设备切换和建立可能需要一些时间。以下代码可能会对您有所帮助。

ConnectivityManager connMngr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
try { 
    return connMngr.getActiveNetworkInfo().isConnectedOrConnecting(); 
} 
catch (NullPointerException npe) { 
    return false; 
} 

看起来你有问题的TCP协议。它可能在WiFi或3G信号较弱的情况下。使用try/catch。

失败:EHOSTUNREACH(没有到主机的路由)

所以路由未正确设置。

我发现,对于某些设备,你必须在WifiConfigurationipAssignment场手动设置为WifiConfiguration.IpAssignment.DHCP应该是一个DHCP请求改变编程的WiFi之后进行。这只能通过反射,see this answer how to code it。捕获所有异常,因为在其他设备上该字段甚至不存在。