互联网连接检查行为异常
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 服务器或中间网络可能很忙。同样,连接超时时间太短。
在发明自己的方法来检查互联网连接之前,您应该阅读以下内容:
Android 开发者指南:Determine and monitor the connectivity status
Whosebug:Android check internet connection
我一直需要一种方法来检查用户是否可以上网。我使用了这种方法:
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 服务器或中间网络可能很忙。同样,连接超时时间太短。
在发明自己的方法来检查互联网连接之前,您应该阅读以下内容:
Android 开发者指南:Determine and monitor the connectivity status
Whosebug:Android check internet connection