互联网连接检查行为异常

Internet Connection Check behaving weirdly

我一直需要一种方法来检查用户是否可以上网。我使用了这种方法:

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);
    }
}

...以下方式:

new InternetCheck(hasInternet -> { /* do something with boolean response */ });

然而,它似乎并不像人们想象的那么强大:有时(不经常)我的 phone 连接到 WiFi,但这种方法 returns false.

可能 scenarios/diagnostics 为什么会发生这种行为?

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

然而,这并不是该方法失败的唯一原因。另一位开发人员在他没有更改 WiFi 连接的情况下发生了这种情况。

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

您的 1.5 秒连接超时时间太短,无法承受额外的延迟。

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


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