我试图让我的应用检查它是否能够连接到互联网。
我的研究告诉我,网络级连接并不一定意味着您可以访问远程站点/服务。例如:
Detect if Android device has Internet connection
我已经尝试过Q& A中的解决方案,他们有点"工作。我的问题是urlc.setConnectTimeout(50000)
(即超时50秒)似乎没有任何效果。相反,我的应用程序几乎立即报告错误。
我希望我的应用程序在报告失败之前继续尝试连接一段时间。
答案 0 :(得分:0)
Android系统已经为您完成了这项工作。不要经常轮询手机的网络状态,而是注册 BroadcastReceivers 以进行WiFi和网络状态更改,并在WiFi或网络状态发生变化时处理系统发送的Intents。
你应该建立一个 BroadcastReceiver ,当连接状态发生变化时,它会被触发。
<强> NetworkChangeReceiver.java 强>
public class NetworkChangeReceiver extends BroadcastReceiver
{
@Override
public void onReceive(final Context context, final Intent intent)
{
String status = NetworkUtil.getConnectivityStatusString(context);
Toast.makeText(context, status, Toast.LENGTH_LONG).show();
}
}
<强> NetworkUtil.java 强>
public class NetworkUtil
{
public static int TYPE_WIFI = 1;
public static int TYPE_MOBILE = 2;
public static int TYPE_NOT_CONNECTED = 0;
public static int getConnectivityStatus(Context context)
{
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (null != activeNetwork)
{
if(activeNetwork.getType() == ConnectivityManager.TYPE_WIFI)
return TYPE_WIFI;
if(activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE)
return TYPE_MOBILE;
}
return TYPE_NOT_CONNECTED;
}
public static String getConnectivityStatusString(Context context)
{
int conn = NetworkUtil.getConnectivityStatus(context);
String status = null;
if (conn == NetworkUtil.TYPE_WIFI)
{
status = "Wifi enabled";
}
else if (conn == NetworkUtil.TYPE_MOBILE)
{
status = "Mobile data enabled";
}
else if (conn == NetworkUtil.TYPE_NOT_CONNECTED)
{
status = "Not connected to Internet";
}
return status;
}
}
在Androidmanifest.xml中添加必需的权限和接收器
答案 1 :(得分:0)
对您的问题最可能的解释是,您的应用可能无法连接的原因有很多。其中包括:
“问题”是只有其中一些表现为连接超时。其他(例如,错误的DNS条目,本地网络问题,服务未运行等)通常会导致不同的症状;例如DNS查找失败,“拒绝连接”,“无网络路由”等。这些通常会立即发生,网络堆栈不会尝试重试。
正如评论中所提到的,解决方案是实现重试循环。
是的......实现这一点有点复杂。并且有一些陷阱。例如, unwise 让重试逻辑尝试立即重试或重复次数过多,因为这些行为可能表现为对远程服务的“拒绝服务”攻击。