Почему я получаю SoketTimeOutException в спящем режиме устройства?
Я вызываю HTTPS-соединение веб-службы из класса Service, которое вызывается диспетчером тревог каждые 1 минуту. Когда я запускаю службу, она работает нормально, я получаю ответ от веб-службы, пока устройство не переходит в спящий режим. Когда экран устройства отключается, при следующем вызове веб-службы я получаю эту ошибку
com.turbomanage.httpclient.HttpRequestException: java.net.SocketTimeoutException: connect timed out
он будет продолжать выдавать это исключение, пока я не активирую устройство. Когда устройство активируется, веб-служба начинает получать ответ от сервера, и тогда я не получаю исключения. Поэтому, пожалуйста, кто-нибудь, скажите мне, в чем может быть проблема. Тестирующее устройство - Nexsus 5X.
2 ответа
Я вызываю HTTPS-соединение веб-службы из класса обслуживания, которое вызывается диспетчером аварийных сигналов каждые 1 мин.
Это не будет работать на Android 6.0+, если ваше приложение не находится в белом списке оптимизации батареи. Режим ожидания остановит большинство ваших тревог, и в тех случаях, когда вы получаете контроль, у вас может не быть доступа в Интернет.
Кроме того, имейте в виду, что пробуждение устройства каждую минуту для перехода к сетевому вводу-выводу разряжает батарею, поэтому в Android 6.0 в первую очередь был введен режим Doze.
Оптимизировать для режима ожидания и ожидания приложений
https://developer.android.com/training/monitoring-device-state/doze-standby
И код для игнорирования батареи оптимизировать
PowerManager powerManager = (PowerManager)getSystemService(Context.POWER_SERVICE);
Intent intent = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
if (powerManager.isIgnoringBatteryOptimizations(getPackageName())) {
intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
}
else {
intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivity(intent);
}