URL-адрес Android не будет подключаться после более длительного периода обслуживания - PullRequest
0 голосов
/ 24 января 2019

Я не уверен, как даже поставить хорошее название для этого вопроса.

У меня есть следующий класс в моем приложении для Android:

class Translator {
    public Translator() {
    }

    public String bingTranslate(String text) throws IOException {

        String response;
        String textEncoded= URLEncoder.encode(text, "utf-8");

        String url = "https://www.bing.com/tdetect";
        URL obj = new URL(url);
        HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();

        con.setRequestMethod("POST");
        //con.setRequestProperty("User-Agent", USER_AGENT);
        con.setRequestProperty("Accept-Language", "UTF-8");

        con.setDoOutput(true);
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(con.getOutputStream());
        outputStreamWriter.write("text="+textEncoded);
        outputStreamWriter.flush();


        BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
        response=in.readLine();
        in.close();
        con.disconnect();

        return response;

    }
}

И я вызываю егокак это:

detected = new Translator().bingTranslate(text.substring(0, Math.min(text.length(), 100)));

Это работает абсолютно нормально, однако после того, как моя служба работает в течение длительного времени (например, день или около того), URL-адрес не удается подключиться, из-за чего мне не удалось подключиться.Принудительная остановка службы и ее перезапуск заставляет всю работу снова работать.

Мой сервис расширяет NotificationListenerService, поэтому он всегда работает и пытается использовать Bing для определения языка некоторых уведомлений.

Строка detect является локальной переменной, и на класс Translator больше нигде нет ссылок.Сначала я подумал, что на него могут как-то ссылаться, потому что я использовал класс Translator в качестве поля.Но даже после перемещения Переводчика на локальный вызов проблема все еще всплывает.

Что я заметил при сбое соединения, выбрасывает URL и ошибка, с которой он не смог соединиться: https://www.bing.com/204.79.197.200:443, что на самом деле неСтрока URL-адреса, которую я использовал для совершения звонка.

Я упускаю очевидное или это потенциальная ошибка в Android?

В качестве вопроса сноски можно найти альтернативу для создания httpвызов?Я посмотрел на Volley , но это работает с обратными вызовами, и я не слишком заинтересован, чтобы вносить изменения во все мое приложение, чтобы приспособиться к этому.

ОБНОВЛЕНИЕ

Я изменил код и переключился на Volley , который, кажется, работает нормально даже через 3 дня, пока что все хорошо, но остается вопрос, почему простое соединение Https не удается через некоторое время?Я просто не мог понять это ...

1 Ответ

0 голосов
/ 24 января 2019

Глядя на ваш вопрос, я предполагаю, что вы хотите, чтобы служба работала бесконечно, но она работает только один день и выдает исключение. Я верю, что ОС Android ограничивает вашу службу для более продолжительного времени из-за некоторых ограничений, введенных командой Android. Ваша служба не может работать в течение более длительного периода времени, потому что эта длительно работающая служба потребляет много батареи и ресурсов процессора Android. Если вы используете фоновую службу, то это не является правильным решением для реализации долгосрочных служб, поэтому я предлагаю вам использовать Foreground service и позволить приложению отображать одно уведомление , это не позволит ОС Android уничтожить ваш сервис. Надеюсь, это поможет.

...