检查互联网连接一段时间
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了检查互联网连接一段时间相关的知识,希望对你有一定的参考价值。
我正在尝试让我的应用程序检查它是否能够连接到互联网。
我的研究告诉我,网络级连接并不一定意味着您可以访问远程站点/服务。例如:
Detect if Android device has Internet connection
我在那个Q&A中尝试了解决方案,他们“有点”工作。我的问题是urlc.setConnectTimeout(50000)
(即50秒超时)似乎没有任何影响。相反,我的应用程序几乎立即报告错误。
我希望我的应用程序在报告失败之前继续尝试连接一段时间。
android系统已经为您做到了这一点。不是经常轮询电话以获得网络状态,而是注册BroadcastReceivers以进行WiFi和网络状态更改,并在WiFi或网络状态发生变化时处理系统发送的Intents。
您应该创建一个BroadcastReceiver,它将在连接状态发生变化时被触发。
network change receiver.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();
}
}
network UT IL.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中添加必需的权限和接收者
对您的问题最可能的解释是,您的应用可能无法连接的原因有很多。这些包括:
- 您的应用可能没有连接权限
- 用户的设备可能不在移动数据或WiFi范围内
- 互联网可能已被用户禁用
- 您可能正在尝试连接到IP或DNS条目不正确的主机
- 主机或其家庭网络可能暂时脱机
- 该服务可能未在主机上运行
- 该服务可能会被破坏
- 可能存在影响连接的其他网络问题。
“问题”是只有其中一些表现为连接超时。其他(例如,错误的DNS条目,本地网络问题,服务未运行等)通常会导致不同的症状;例如DNS查找失败,“拒绝连接”,“无网络路由”等。这些通常会立即发生,网络堆栈不会尝试重试。
正如评论中所提到的,解决方案是实现重试循环。
- 你需要区分不同类型的失败......基于抛出的异常。
- 对于“超时”例外,请勿重试。
- 对于指示无法恢复的故障的例外(例如网络权限,无DNS条目等),重试毫无意义。
- 对于其他人,请实现自己的计时器并重试逻辑。
是的......实现这一点有点复杂。并且有一些陷阱。例如,让重试逻辑尝试立即重试或重复次数过多是不明智的,因为这些行为可能表现为对远程服务的“拒绝服务”攻击。
以上是关于检查互联网连接一段时间的主要内容,如果未能解决你的问题,请参考以下文章