Пинг Google DNS-сервера в фоновом режиме иногда приводит к сбою - PullRequest
0 голосов
/ 23 сентября 2018

Я создаю простое приложение для Android, чтобы проверить, доступно ли активное интернет-соединение на моем телефоне.Для проверки я использую сервис, который запускается в фоновом режиме каждые 30 секунд и «пингует» DNS-сервер Google, чтобы проверить, есть ли ответ.

Это мой класс, используемый для проверки статуса Интернета:

public class NetworkStatus {

private static final String GOOGLE_DNS_SERVER = "8.8.8.8";
private static final String CLOUDFLARE_DNS_SERVER = "1.1.1.1";
private static final String TAG = "OUTGOING-NET-STATUS";
private static final String RETRY_TAG = "DNS-CHECK";

boolean pingDnsServerSuccessful() {
    boolean success = false;
    int count = 0;
    final int MAX_TRIES = 15;

    while (!success && count++ < MAX_TRIES) {
        Log.d(RETRY_TAG, "Retry value: " + count + " out of " + MAX_TRIES);
        success = isDnsServerReachable(CLOUDFLARE_DNS_SERVER) || isDnsServerReachable(GOOGLE_DNS_SERVER);
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    if (success) {
        Log.d(TAG, "Outgoing Internet Traffic is Enabled");
    } else {
        Log.d(TAG, "Error reaching Outgoing Traffic");
    }

    return success;

}

private boolean isDnsServerReachable(String dnsServer) {
    int connectionTimeout = 250;

    try {
        return InetAddress.getByName(dnsServer).isReachable(connectionTimeout);
    } catch (Exception e) {
        Log.d(TAG, "Exception: Error while pinging " + dnsServer + " DNS server: " + e);
    }

    return false;
}

}

, и это код, который запускает фоновый таймер в службе:

public void startTimer() {
    //set a new Timer
    timer = new Timer();

    networkStatus = new NetworkStatus();
    notificationManager = new NotificationManager();

    //initialize the TimerTask's job
    initializeTimerTask();

    //schedule the timer, to wake up every 30 seconds
    timer.schedule(timerTask, 1000, 30000); //
}

/**
 * it sets the timer to print the counter every x seconds
 */
public void initializeTimerTask() {

    timerTask = new TimerTask() {
        public void run() {

            Log.i("in timer", "in timer ++++  " + (counter++));

                if (networkStatus.pingDnsServerSuccessful()) {
                    Log.i(PING_TAG, "Active Internet Connection");

                    if (!notificationManager.getLastSentNotificationType().equals(NotificationType.INTERNET_UP)) {
                        Log.i(NOTIFICATION_TAG, "Internet ON");
                        notificationManager.sendNotification(getApplicationContext(), NotificationType.INTERNET_UP);
                    }

                } else {
                    Log.i(PING_TAG, "No Internet Connection");

                    if (!notificationManager.getLastSentNotificationType().equals(NotificationType.INTERNET_DOWN)) {
                        Log.i(NOTIFICATION_TAG, "Internet OFF");
                        notificationManager.sendNotification(getApplicationContext(), NotificationType.INTERNET_DOWN);
                    }
                }

        }
    };
}

Все отлично работает в течение случайного количества времени (минут / часов).) когда внезапно DNS-сервер перестает быть доступным, когда приложение работает в фоновом режиме и телефон заблокирован.Активация экрана телефона сразу же приводит к успеху при пинге сервера.

Вот некоторые журналы, отражающие поведение: Журналы

Кто-нибудь знает, почему этопроисходит?Я очень сомневаюсь, что Google или Cloudflare DNS-сервер перестает отвечать на запросы ...

Большое спасибо!

1 Ответ

0 голосов
/ 23 сентября 2018

Это режим ожидания.Для экономии энергии фоновые запросы ограничиваются небольшим окном каждые 15 минут или около того для запросов.Кроме того, фоновые процессы могут быть убиты в любое время.

Я не уверен, что вы на самом деле пытаетесь сделать, но есть на 100% лучшие способы сделать это.Например, JobScheduler позволяет планировать работу, чтобы уйти, только если интернет подключен.Нет необходимости пинговать сервер вручную, и не нужно делать всю работу, чтобы избежать Doze.

...