首页 > 解决方案 > 如何使用来自另一个线程“CalledFromWrongThreadException”的活动

问题描述

我使用 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);

}

媒体播放器的监听器工作正常。Text To Speech 的监听器抛出异常:

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

我试图用谷歌搜索这个,但我不明白我的问题的根源,为什么在使用 mediaplayer 的情况下它可以工作以及为什么 TTS 会抛出异常。

请给我一个提示如何解决这个问题。

标签: androiduser-interfacetext-to-speech

解决方案


当您对视图执行任何操作时,必须是主线程,如果您在其他线程中,则不能在该线程中执行操作。

采用

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  
        } 
    });

推荐阅读