Поддерживайте работу JobIntentService с асинхронной задачей внутри - PullRequest
0 голосов
/ 07 июня 2018

Я хочу разработать функцию преобразования текста в речь (TTS) в моем приложении.Это должно быть реализовано внутри Service, потому что пользователь может оставить «детали» Activity и вернуться к «основному» Activity или даже покинуть мое приложение, и он все равно должен произносить громкий текст.Так как Oreo ввел некоторые фоновые ограничения для сервисов, и я должен поддерживать 4.0+, я должен использовать JobIntentService

Проблема в том, что TTS имеет асинхронную реализацию и JobIntentService убивается сразу после того, как onHandleWork завершает свою работу, дажекогда я использую startForeground (в моем коде showSpeakingNotification)

Самое смешное, что когда я, но точка останова внутри onHandleWork после метода 'speakOut' или просто раскомментирую Thread.sleep служба работает и читает моитекст (и уведомление переднего плана присутствует).

Вопрос в том, как предотвратить автоматическое уничтожение моей службы, когда она действительно запущена, но с использованием асинхронной функции внутри?

@Override
protected void onHandleWork(@NonNull Intent intent) {
    if (ACTION_SPEAK.equals(intent.getAction()) && intent.hasExtra(EXTRA_TEXT_ARRAY)) {
        ArrayList<String> textArr = intent.getStringArrayListExtra(EXTRA_TEXT_ARRAY);
        showSpeakingNotification(textArr.get(0));
        if (ttsInitialized)
            speakOut(textArr);
        else if (ttsInitListener != null)
            ttsInitListener.setPendingText(textArr);
    } else if (ACTION_STOP_SPEAKING.equals(intent.getAction())) {
        if (ttsInitialized && tts.isSpeaking())
            tts.stop();
    }
    try {
        //Thread.sleep(10000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

1 Ответ

0 голосов
/ 07 июня 2018

просто раскомментируйте сервис Thread.sleep и читает мой текст

Когда вы добавляете Thread.sleep(10000);, в результате блокируется текущий поток, он не отвечает на вашу речь,Когда вы комментируете текущую ветку, вы можете читать ваши данные

Вопрос в том, как предотвратить автоматическое уничтожение моей службы, когда она действительно запущена, но с использованием асинхронной функции внутри?

Примечание возможно.Ваши требования могут быть выполнены с помощью Foreground Service.Обратитесь к этому SO для реализации Foreground Service

...