检查互联网连接一段时间

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条目等),重试毫无意义。
  • 对于其他人,请实现自己的计时器并重试逻辑。

是的......实现这一点有点复杂。并且有一些陷阱。例如,让重试逻辑尝试立即重试或重复次数过多是不明智的,因为这些行为可能表现为对远程服务的“拒绝服务”攻击。

以上是关于检查互联网连接一段时间的主要内容,如果未能解决你的问题,请参考以下文章

android根据互联网连接更改视图

没有带有拉动刷新的互联网消息 webview 片段

谷歌地图片段显示,但没有地图

Alamofire 5 获取错误代码以检查互联网连接

如何在应用程序运行时连续检查互联网连接

检查互联网连接 OKHTTP