android - 如何使用来自另一个线程“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 会抛出异常。
请给我一个提示如何解决这个问题。
解决方案
当您对视图执行任何操作时,必须是主线程,如果您在其他线程中,则不能在该线程中执行操作。
采用
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
}
});
推荐阅读
- php - 为什么我在 Laravel 5.5.43 中收到“找不到类 'App\Providers\Form'”错误?
- c# - 如何比较(pictureBox1.Image 与 Properties.Resources.bug1)?
- android - 如何查看应用程序支持的方案?
- java - 如何在模型映射器转换器中保留异常消息
- reactjs - 如何在 Amazon Cloudfront 的 React 应用程序中提供静态博客
- c# - AnalysisContext.EnableConcurrentExecution() - 它到底是做什么的?
- directx-12 - 在 DX12 中,多个 ExecuteCommandLists 调用提供哪些订购保证?
- r - 是否可以按设备类型自动对用户代理进行分类?
- java - 如何通过正则表达式从字符串上的多个相同字符中找到一个字符
- angular - 用于字段验证的 ANTLR4 语法