我一直需要一种方法来检查用户是否有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连接的情况下发生了这种情况。
答案 0 :(得分:3)
手机进入睡眠状态时,Wifi连接断开。再次唤醒手机时,要花费一些时间才能重新建立连接。
您的1.5秒连接超时太短,无法容纳该额外的延迟。
此外,DNS服务器或中间网络可能只是很忙。同样,连接超时太短。
在发明自己的方式来检查Internet连接之前,您应该阅读以下内容:
Android开发者指南:Determine and monitor the connectivity status
StackOverflow:Android check internet connection