Internet连接检查行为异常

时间:2018-09-09 17:11:33

标签: java android network-programming

我一直需要一种方法来检查用户是否有Internet。我使用了这种方法:

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连接上将其打开以备份到应用程序。尽管我的电话显示它显然已经建立了新的WiFi连接(因为它是保存的网络),但支票仍返回false

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

1 个答案:

答案 0 :(得分:3)

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

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

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


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