检查互联网连接一段时间

时间:2017-12-30 00:28:20

标签: java android connection android-internet

我试图让我的应用检查它是否能够连接到互联网。

我的研究告诉我,网络级连接并不一定意味着您可以访问远程站点/服务。例如:

Detect if Android device has Internet connection

我已经尝试过Q& A中的解决方案,他们有点"工作。我的问题是urlc.setConnectTimeout(50000)(即超时50秒)似乎没有任何效果。相反,我的应用程序几乎立即报告错误。

我希望我的应用程序在报告失败之前继续尝试连接一段时间。

2 个答案:

答案 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)

对您的问题最可能的解释是,您的应用可能无法连接的原因有很多。其中包括:

  • 您的应用可能无权连接
  • 用户的设备可能不在移动数据或wifi范围内
  • 用户可能已禁用互联网
  • 您可能尝试连接到IP或DNS条目不正确的主机
  • 主机或其家庭网络可能暂时脱机
  • 该服务可能未在主机上运行
  • 服务可能已被破坏
  • 可能存在影响连接的其他网络问题。

“问题”是只有其中一些表现为连接超时。其他(例如,错误的DNS条目,本地网络问题,服务未运行等)通常会导致不同的症状;例如DNS查找失败,“拒绝连接”,“无网络路由”等。这些通常会立即发生,网络堆栈不会尝试重试。

正如评论中所提到的,解决方案是实现重试循环。

  • 你需要区分不同类型的失败......基于抛出的异常。
  • 对于“超时”例外,请勿重试。
  • 对于指示无法恢复的故障的例外(例如网络权限,无DNS条目等),重试毫无意义。
  • 对于其他人,请实施自己的计时器并重试逻辑。

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

相关问题