#java #wait
#java #подождите
Вопрос:
Я пытаюсь проверять, включен Интернет или нет постоянно каждые 5 секунд, я написал приведенный ниже код, но некоторые из них всегда заходят внутрь wait () и ждут бесконечно.
Код, который я написал :
Socket socket = null;
public void checkInternetConnectivity() throws InterruptedException {
boolean reachable = false;
ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
service.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
try {
socket = new Socket("xxx.xxx.xxx.x", xx);
} catch (UnknownHostException e) {
stopApp();
} catch (IOException e) {
stopApp();
}
}
}, 0, 5, TimeUnit.SECONDS);
synchronized (this) {
wait();
}
}
private void stopApp() {
System.out.println("Internet Not Available stopping app");
System.exit(0);
}
Он всегда зависал внутри ниже :
synchronized (this) {
wait();
}
Комментарии:
1. Если вы ждете, кто-то также должен уведомить об этом? Где это?
2. если это запланированная задача, зачем ждать?
3. где вы делаете notify()?
4. @SMA- Я согласен с вами, но не уверен, где именно я здесь уведомляю.
5. почему бы этого не ожидать? Ранее все, что вы делали, это настраивали
task
для запуска в другом потоке.
Ответ №1:
Вы могли бы сделать:
InetAddress.isReachable
В зависимости от ваших потребностей вам следует рассмотреть возможность подключения к определенному хосту с помощью
private static boolean googleIsAvailable() {
try {
final URL url = new URL("http://www.google.com");
final URLConnection connection = url.openConnection();
connection.connect();
connection.getInputStream().close();
return true;
} catch (MalformedURLException e) {
throw new RuntimeException(e);
} catch (IOException e) {
return false;
}
}
Если вы общаетесь с веб-сервисом, веб-сервис должен предоставить метод GET, чтобы проверить, доступен ли он.
Если вам нужно постоянно проверять, попробуйте что-нибудь вроде
Socket s = new Socket(SERVER_ADDRESS, TCP_SERVER_PORT);
while(s.isConnected()){
//do your stuff
}
Вам также следует проверить опцию keepAlive.
Но более важный вопрос заключается в том, что произойдет в вашем приложении, если подключение к Интернету больше не доступно?
Большинство методов генерируют исключения, если сервер больше не доступен.
Вы могли бы просто перехватить их и отреагировать на это.
Комментарии:
1. Спасибо за ваш ответ, но я думаю, что он не будет проверять постоянно. Он будет проверять только тогда, когда и где я вызываю эту функцию.
2. Обновил мой ответ… Соединения с сокетами имеют метод «isConnected»