Java 互联网连接检查行为异常

Java 互联网连接检查行为异常,java,android,network-programming,Java,Android,Network Programming,我一直需要一种方法来检查用户是否有互联网。我采用了这种方法: public class InternetCheck extends AsyncTask<Void, Void, Boolean> { private Consumer mConsumer; public interface Consumer { void accept(Boolean internet); } public InternetCheck(Consumer

我一直需要一种方法来检查用户是否有互联网。我采用了这种方法:

public class InternetCheck extends AsyncTask<Void, Void, Boolean> {

    private Consumer mConsumer;

    public interface Consumer {
        void accept(Boolean internet);
    }

    public InternetCheck(Consumer consumer) {
        mConsumer = consumer;
        execute();
    }

    @Override
    protected Boolean doInBackground(Void... voids) {
        try {
            Socket sock = new Socket();
            sock.connect(new InetSocketAddress("8.8.8.8", 53), 1500);
            sock.close();
            Log.w("INTERNET CHECK", "has Internet");
            return true;
        } catch (IOException e) {
            Log.w("INTERNET CHECK", "NO Internet");
            return false;
        }

    }

    @Override
    protected void onPostExecute(Boolean internet) {
        mConsumer.accept(internet);
    }
}
然而,它似乎不像人们想象的那样健壮:有时(不是经常)我的手机连接到WiFi,但这种方法返回
false

关于这种行为可能发生的原因,有哪些可能的场景/诊断

我个人的经验是,当我的手机打开应用程序并连接到WiFi时,这种情况似乎会发生。然后,手机进入睡眠状态,我移动位置,然后通过新的WiFi连接将其打开并返回应用程序。尽管我的手机显示它已明确建立了新的WiFi连接(因为它是一个已保存的网络),但检查返回
false


然而,这并不是这种方法失败的唯一途径。另一位开发者在没有更改WiFi连接时发生了这种情况。

手机进入睡眠状态时,WiFi连接会断开。当手机再次唤醒时,重新建立连接需要时间

1.5秒的连接超时时间太短,无法容纳额外的延迟

此外,DNS服务器或中间网络可能很忙。同样,连接超时时间太短


在发明自己的互联网连接检查方法之前,您应该阅读以下内容:

  • Android开发者指南:

  • 堆栈溢出:


手机进入睡眠状态时,Wifi连接会断开。当手机再次唤醒时,重新建立连接需要时间

1.5秒的连接超时时间太短,无法容纳额外的延迟

此外,DNS服务器或中间网络可能很忙。同样,连接超时时间太短


在发明自己的互联网连接检查方法之前,您应该阅读以下内容:

  • Android开发者指南:

  • 堆栈溢出:


听起来这是一个合理的解释。建议的超时值是多少?@payne这是由你来决定的最佳值,平衡误报与等待时间过长的误报。我想我可以将其重新表述为“什么可能是行业标准”,因为我不知道建立一个平均连接需要多少时间,例如。@payne我不知道有这样的标准。听起来这是一个合理的解释。建议的超时值是多少?@payne这是由你来决定的最佳值,平衡误报与等待时间过长的误报。我想我可以将其重新表述为“什么可能是行业标准”,因为我不知道建立一个平均连接需要多少时间,例如,@payne我不知道有这样的标准。
new InternetCheck(hasInternet -> { /* do something with boolean response */ });