Internet连接检查表现得很奇怪

问题描述 投票:0回答:1

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

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

然而,它似乎没有人们想象的那么强大:有时(不常见)我的手机连接到WiFi,但这种方法返回false

为什么会出现这种行为的可能情景/诊断有哪些?

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

但是,这不是此方法似乎失败的唯一方法。另一位开发人员在他没有改变他的WiFi连接时发生了这种情况。

java android network-programming
1个回答
3
投票

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

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

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


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

© www.soinside.com 2019 - 2024. All rights reserved.