如何在android上进行多个同步语音识别调用?

时间:2013-12-27 17:03:48

标签: android asynchronous speech-recognition synchronous

我想按顺序进行一些Speech to Text调用,我试试

for (int i = 0; i < 3; i++) {
    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
    intent.putExtra(RecognizerIntent.EXTRA_PROMPT, getString(R.string.set_names));
    intent.putExtra("index", i);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivityForResult(intent, REQUEST_CODE);
}

并在函数中捕获结果:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
        Intent intent = getIntent();
        final int index = intent.getIntExtra("index", 0);
        ...

但我认为onActivityResult函数被称为异步。我该如何解决?

1 个答案:

答案 0 :(得分:1)

您可以轻松地从语音识别中抽象出来,并专注于并行编程。你想要做的只是开始一个活动并等待它的结果。这个问题已在这里多次询问,您可以通过搜索找到讨论,例如检查

Synchronous startActivityForResult - Waiting for Activity to Complete

简而言之,您应该避免在等待活动结果时阻止UI线程。这将阻止您的应用程序的UI,它将被关闭。相反,您应该继续在onActivityResult回调中继续处理。所以你的代码应该是这样的:

startRecognition() {
    runRecognitionStep(0);
}

runRecognitionStep(int index) {
    intent.putExtra("index", index);
    startActivityForResult(intent, REQUEST_CODE);
}

onActivityResult() {
    int i = intent.getExtra("index");
    processResult();
    if (i < 3)
        runRecognitionStep(i + 1);
}

了解如何进行基于回调的编程,这很容易。