我已经看到了有关网络连接的所有答案,它们非常好。唯一的问题是下一个用例。
如果手机连接到wifi网络,但路由器丢失了与互联网的连接。所以我考虑将这个添加内容添加到围绕SO给出的代码中:
/** Google public DNS service IP address **/
public static final String GOOGLE = "http://8.8.8.8";
public static boolean isConnected(Context context) {
ConnectivityManager cm = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
if (info == null) {
return false;
}
if (info.isConnected()) {
try {
InetAddress addr = InetAddress.getByName(GOOGLE);
return addr.isReachable(10000);
} catch (UnknownHostException e) {
Log.wtf("Utils", e);
} catch (IOException e) {
Log.wtf("Utils", e);
}
return false;
} else
return false;
}
}
唯一的问题是它在主线程上运行,或更正确地说,它在主线程上运行时崩溃。
如果我将在一个单独的线程中运行它,它将在从服务器获得有效答案之前返回。
有关如何测试互联网连接(与网络连接相关)的任何想法?
答案 0 :(得分:0)
您必须将逻辑拆分为在检查连接之前和检查连接之后
然后使用 Handler 和后台线程,您可以测试这样的连接:
private static void onConnectivityCheckFinish(boolean result){
}
public static void isConnected(Context context) {
ConnectivityManager cm = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
if (info == null) {
onConnectivityCheckFinish(false);
}
if (info.isConnected()) {
final Handler handler = new Handler(
);
new Thread(){
@Override
public void run(){
try {
InetAddress addr = InetAddress.getByName(GOOGLE);
final boolean result = addr.isReachable(10000);
handler.post(new Runnable(){
@Override
public void run(){
onConnectivityCheckFinish(result);
}
});
} catch (Exception e) {
Log.wtf("Utils", e);
handler.post(new Runnable(){
@Override
public void run(){
onConnectivityCheckFinish(false);
}
});
}
}
}.start();
onConnectivityCheckFinish(false);}
else {
onConnectivityCheckFinish(false);
}
}