Android的:如何把TTS里面的AsyncTask(Android: how to put TT

2019-09-28 00:58发布

我已经工作了这么长时间,但仍然stucked。 游戏具有TTS,它似乎需要很长的时间来加载(或实际上是用于TTS正确??的代码),所以在考虑到漫长的等待时间(在真实的设备进行测试时约3秒),我会喜欢把进度对话框(PD)。

该PD有一个循环圈。 我的TTS一部分,下面的代码的代码:

的AsyncTask:

private class MainFrameTask extends AsyncTask<String,Integer,String> implements OnInitListener, OnUtteranceCompletedListener
{
    private Index_game_card_intro mainFrame = null;  

    public MainFrameTask(Index_game_card_intro mainFrame)
    {  
        this.mainFrame = mainFrame;  
    }  

    @Override  
    protected void onCancelled() 
    {  
        stopProgressDialog();  
        super.onCancelled();  
    }  

    @Override
    protected void onPreExecute()
    {           
        startProgressDialog(); 
    }

    @Override
    protected String doInBackground(String... params) 
    {            
        // setup TTS part 1.1
          mTts = new TextToSpeech(Index_game_card_intro.this, this);  // TextToSpeech.OnInitListener



        return "Done!";
    }

    protected void onPostExecute(String result) 
    {
        stopProgressDialog();      
    }

 // setup TTS part 2    
    @Override
    public void onUtteranceCompleted(String utteranceId) 
    {  
        Log.v(TAG, "Get completed message for the utteranceId " + utteranceId);  
        lastUtterance = Integer.parseInt(utteranceId);  
    }  

// setup TTS part 3 
    @Override
    public void onInit(int status) 
    {  
        if(status == TextToSpeech.SUCCESS)  
        {  
            int result = mTts.setLanguage(Locale.US);  // <====== set speech location
            mTts.setSpeechRate((float) 0.8);
            mTts.setPitch(1.0f);
            if(result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED)  
            {  
                // button_header.setEnabled(false);  
            }  
            else  
            {  
                // button_header.setEnabled(true);  
                mTts.setOnUtteranceCompletedListener(this);  
            }  
        }     
    }    
}

外面的AsyncTask:

// setup TTS part 4 
    private void speakText()  
    {  
        lastUtterance++;  
        if(lastUtterance >= loveArray.length)  
        {  
            lastUtterance = 0;  
        }  
        Log.v(TAG, "the begin utterance is " + lastUtterance);  
        for(int i = lastUtterance; i < loveArray.length; i++)  
        {  
            params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, String.valueOf(i));  
            mTts.speak(loveArray[i], TextToSpeech.QUEUE_ADD, params);  
            mTts.playSilence(ttsilience, TextToSpeech.QUEUE_ADD, null);
        }  
    } 

    public void speak_action(String to_speak) 
    {
        // speaking
        // setup TTS part 1.2
        StringTokenizer loveTokens = new StringTokenizer(to_speak,",.");  
        int s = 0;  
        loveArray = new String[loveTokens.countTokens()];  
        while(loveTokens.hasMoreTokens())  
        {  
            loveArray[s++] = loveTokens.nextToken();  
        }  
        speakText();            
    }

试用:

我试图替换内的代码doInBackgroundThread.sleep(1000); 。 该PD可与循环圈完美。

题:

该PD显示,但冻结,即。 圆不循环。 我想问一下

  1. 是否应该TTS以这种方式进行编码(这实际上并不需要AsyncTask ?)

  2. 如果需要AsyncTask ,如何可以在代码重新安排?

我用Google搜索,但似乎没有人把里面的TTS AsyncTask 。 想听听你的意见......非常感谢!

文章来源: Android: how to put TTS inside AsyncTask