Как использовать активность из какого-то другого потока "CalledFromWrongThreadException" - PullRequest
0 голосов
/ 18 июня 2019

Я использую классы MediaPlayer TextToSpeech.Мне нужно уловить момент, когда разговор окончен.Я использую этот код:

    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp)
        {
            speechRecognizer.startListenig();
            //binding.play.performClick();
        }
    });

    TTS.setOnUtteranceProgressListener(new UtteranceProgressListener() {
        @Override
        public void onDone(String utteranceId) {
            speechRecognizer.startListenig();
        }
        @Override
        public void onError(String utteranceId) { }
        @Override
        public void onStart(String utteranceId) { }
    });

Оба слушателя запускают этот метод:

public void startListenig(){
    binding.progressSound.setVisibility(View.VISIBLE);
    binding.progressSound.setIndeterminate(true);
    speech.startListening(recognizerIntent);

}

Слушатель Media Player работает нормально.Слушатель Text To Speech выдает исключение:

 android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

Я пытался найти это в Google, но я не понимаю источник моей проблемы, почему в случае с медиаплеером это работает и почему TTS генерирует исключения.

Пожалуйста, дайте мне подсказку, как решить эту проблему.

1 Ответ

1 голос
/ 18 июня 2019

Когда вы выполняете какую-либо операцию с представлением, он должен быть основным потоком, если вы находитесь в другом потоке, чем вы не можете выполнить операцию в этом потоке.

используйте

runOnUiThread(new Runnable() {
        @Override
        public void run() {

        }
    });

методдля действия, для фрагмента или адаптера используйте context.runOnUiThread()

, если runOnUiThread () не работает,

new Handler(Looper.getMainLooper()).post(new Runnable() {
        @Override
        public void run() {
          // This is your code  
        } 
    });
...