Android:检查网络和真实的互联网连接 [英] Android: Check network and real internet connectivity
问题描述
下面是一段 Android 代码,可以很好地检查网络是否已连接.
Below is the piece of Android code which works fine to check if network is connected or not.
public static boolean isNetworkAvailable(Context context)
{
ConnectivityManager mConnectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
return (mConnectivityManager != null && mConnectivityManager.getActiveNetworkInfo().isConnectedOrConnecting()) ? true : false;
}
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
但拥有活动网络接口并不能保证特定的网络服务可用.
But having an active network interface doesn't guarantee that a particular networked service is available.
很多时候我们已经连接到网络,但仍然无法访问常见的互联网网络服务,例如谷歌
A lot of time happens that we are connected to network but still not reachable to common internet network services, e.g. Google
常见场景:
- 连接到 Wi-Fi 的 Android 设备,结果证明它是私人的网络.所以 isNetworkAvailable 将返回网络已连接,但可以不连接到任何其他服务
- 有时,电话信号显示它已连接到服务提供商数据计划.所以网络连接是真实的,但仍然无法访问 Google/Yahoo.
一种方法是检查isNetworkAvailable"函数是否返回TRUE,然后运行以下代码
HttpGet request = new HttpGet(url));
HttpParams httpParameters = new BasicHttpParams();
int timeoutConnection = 60000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
int timeoutSocket = 60000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
request.addHeader("Content-Type", "application/json");
HttpResponse response = httpClient.execute(request);
HttpEntity entity = response.getEntity();
if (entity != null)
{
result = EntityUtils.toString(entity);
}
}
catch (SocketException e)
{
return "Socket Exceptiopn:" + e.toString();
}
catch (Exception e)
{
return "General Execption:" + e.toString();
}
但我认为这不是一个好方法,因为它可能会消耗很多时间
But I think this is not an good way because it may consume lot of time
那么有没有其他有效的(在时间、速度方面)的方式来确保我们连接到网络并且可以访问最常见的互联网服务?
推荐答案
检查此代码...它对我有用 :)
check this code... it worked for me :)
public static void isNetworkAvailable(final Handler handler, final int timeout) {
// ask fo message '0' (not connected) or '1' (connected) on 'handler'
// the answer must be send before before within the 'timeout' (in milliseconds)
new Thread() {
private boolean responded = false;
@Override
public void run() {
// set 'responded' to TRUE if is able to connect with google mobile (responds fast)
new Thread() {
@Override
public void run() {
HttpGet requestForTest = new HttpGet("http://m.google.com");
try {
new DefaultHttpClient().execute(requestForTest); // can last...
responded = true;
} catch (Exception e) {}
}
}.start();
try {
int waited = 0;
while(!responded && (waited < timeout)) {
sleep(100);
if(!responded ) {
waited += 100;
}
}
}
catch(InterruptedException e) {} // do nothing
finally {
if (!responded) { handler.sendEmptyMessage(0); }
else { handler.sendEmptyMessage(1); }
}
}
}.start();
}
然后,我定义处理程序:
Then, I define the handler:
Handler h = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what != 1) { // code if not connected
} else { // code if connected
}
}
};
并启动测试:
isNetworkAvailable(h,2000); // get the answser within 2000 ms
来自 Gilbou 的代码 https://stackoverflow.com/a/5803489/2603719
Code from Gilbou https://stackoverflow.com/a/5803489/2603719
希望能帮到你
这篇关于Android:检查网络和真实的互联网连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!