Java 互联网连接检查行为异常
我一直需要一种方法来检查用户是否有互联网。我采用了这种方法:Java 互联网连接检查行为异常,java,android,network-programming,Java,Android,Network Programming,我一直需要一种方法来检查用户是否有互联网。我采用了这种方法: public class InternetCheck extends AsyncTask<Void, Void, Boolean> { private Consumer mConsumer; public interface Consumer { void accept(Boolean internet); } public InternetCheck(Consumer
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);
}
}
然而,它似乎不像人们想象的那样健壮:有时(不是经常)我的手机连接到WiFi,但这种方法返回false
关于这种行为可能发生的原因,有哪些可能的场景/诊断
我个人的经验是,当我的手机打开应用程序并连接到WiFi时,这种情况似乎会发生。然后,手机进入睡眠状态,我移动位置,然后通过新的WiFi连接将其打开并返回应用程序。尽管我的手机显示它已明确建立了新的WiFi连接(因为它是一个已保存的网络),但检查返回false
然而,这并不是这种方法失败的唯一途径。另一位开发者在没有更改WiFi连接时发生了这种情况。手机进入睡眠状态时,WiFi连接会断开。当手机再次唤醒时,重新建立连接需要时间 1.5秒的连接超时时间太短,无法容纳额外的延迟 此外,DNS服务器或中间网络可能很忙。同样,连接超时时间太短
在发明自己的互联网连接检查方法之前,您应该阅读以下内容:
- Android开发者指南:
- 堆栈溢出:
在发明自己的互联网连接检查方法之前,您应该阅读以下内容:
- Android开发者指南:
- 堆栈溢出:
new InternetCheck(hasInternet -> { /* do something with boolean response */ });