【问题标题】:checking internet connection for some time检查互联网连接一段时间
【发布时间】:2018-06-10 07:42:11
【问题描述】:

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

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

Detect if Android device has Internet connection

我已经尝试了该问答中的解决方案,并且它们“有点”工作。我的问题是urlc.setConnectTimeout(50000)(即 50 秒超时)似乎没有任何效果。相反,我的应用程序几乎立即报告错误。

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

【问题讨论】:

  • 你可以让你的请求执行一定次数的重试,如果它失败了,有特定的例外,那是你要找的吗?
  • @elmorabea..它可能有效,但不应该 (setConnectTimeout(50000)) 在指定时间内继续尝试?
  • 不,连接超时,将允许建立连接的时间(50秒),如果到那时无法建立连接,则会抛出超时异常,但是timeout API 不承诺任何重试,你需要这样做
  • @elmorabea 让我确保我明白这一点.. 设备尝试在(50 秒)内连接,但不一定在整个(秒)内连接,除非建立连接,否则它会抛出错误..对吗?但是如果已经建立了连接,在(50 秒)之后它会被终止吗?
  • @OmarLabib - 我对您问题的编辑是否正确?如果没有,请随时回滚。

标签: java android connection android-internet


【解决方案1】:

Android 系统已经为您做到了。与其不断轮询手机的网络状态,不如注册 BroadcastReceivers 以了解 WiFi 和网络状态的变化,并在 WiFi 或网络状态发生变化时处理系统发送的 Intent。

您应该制作一个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 中添加所需的权限和接收方

【讨论】:

    【解决方案2】:

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

    • 您的应用可能没有连接权限
    • 用户的设备可能超出移动数据或 wifi 范围
    • 互联网可能已被用户禁用
    • 您可能正在尝试连接到 IP 或 DNS 条目不正确的主机
    • 主机或其家庭网络可能暂时离线
    • 服务可能未在主机上运行
    • 服务可能中断
    • 可能存在影响连接的其他网络问题。

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

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

    • 您需要根据抛出的异常来区分不同类型的故障。
    • 对于“超时”异常,不要重试。
    • 对于指示无法恢复的故障的异常(例如网络权限、没有 DNS 条目等),重试是没有意义的。
    • 对于其他人,实现您自己的计时器和重试逻辑。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-26
      • 1970-01-01
      • 2011-04-15
      • 2017-03-16
      • 2014-02-08
      • 2012-06-12
      相关资源
      最近更新 更多