我一直需要一种方法来检查用户是否有互联网。我用这种方法:
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连接时发生了这种情况。
手机进入睡眠状态时会断开Wifi连接。当手机再次唤醒时,重新建立连接需要一些时间。
您的1.5秒连接超时太短,无法容纳额外的延迟。
此外,DNS服务器或中间网络可能只是忙碌。同样,连接超时太短。
在发明自己检查互联网连接的方法之前,您应该阅读以下内容: