2013-06-23 5 views
6

मेरे ऐप में मैं टीटीएस का उपयोग कर रहा हूं। मेरे पास 20 अलग-अलग गतिविधियां हैं जो उपयोगकर्ता बदल जाती हैं जब उपयोगकर्ता बाएं या दाएं स्वाइप करते हैं। गतिविधि के अनुसार, एक पाठ बोली जाती है। मैं अलग थ्रेड के साथ टीटीएस निष्पादित कर रहा हूं और मुख्य चयन के साथ गतिविधि चयन किया जाता है। लेकिन समस्या बहुत धीमी है, यूआई सुस्त महसूस करता है। जब मैं बाएं या दाएं स्वाइप करता हूं, एक बार टीटीएस पाठ बोलने के बाद, गतिविधि बदलती है जो नहीं होना चाहिए क्योंकि मैं टीटीएस के लिए अलग थ्रेड का उपयोग कर रहा हूं। यहाँ कोड है:टेक्स्ट टू स्पीच ऐप यूआई धीमा एंड्रॉइड

टीटीएस वर्ग:

public class textToSpeech { 

TextToSpeech tts=null; 

public textToSpeech(Context con) 
{ 
    tts = new TextToSpeech(con,new TextToSpeech.OnInitListener() { 

     @Override 
     public void onInit(int status) { 

      if(status != TextToSpeech.ERROR) // initialization me error to nae ha 
      { 
       tts.setPitch(1.1f); // saw from internet 
       tts.setSpeechRate(0.4f); // f denotes float, it actually type casts 0.5 to float 
       tts.setLanguage(Locale.US); 
      } 

     } 
    }); 
} 

public void SpeakText (String text) 
{ 
    tts.speak(text, TextToSpeech.QUEUE_FLUSH, null); // TextToSpeech.QUEUE_FLUSH forces the app to stop all the sounds that are currently playing before speaking this text 
} 


public void stopSpeak() 
{ 
    tts.stop(); 
} 

इशारा रीडर वर्ग: (अलग वर्ग)

public void decideAlphabet() 
{ 
    tts.stopSpeak(); 

    threadForTTS.start(); 

    switch (i) 
    { 
     case 0: 
      activities=null; 
      activities = new Intent(contxt,A.class); 
      contxt.startActivity(activities); 

      break; 

     case 1: 
      activities=null; 
      activities = new Intent(contxt,B.class); 
      contxt.startActivity(activities); 

      break; 
        ....... 20 more case statements for selecting activities 
       } 

decideActivity() जब यह चेक किया गया है विधि कहा जाता है, जो स्वाइप किया गया था, दाएं या बाएं स्वाइप करें।

नोट:

इस ऐप्लिकेशन में टीटीएस जोड़ने से पहले, यूआई अंतराल या धीमापन बिना ठीक से प्रदर्शन कर रहा था। टीटीएस जोड़े जाने के बाद, ऐप धीमा हो गया। मैं इस समस्या को

सादर कैसे हल कर सकते हैं

+0

किसी भी यहाँ शरीर में मदद करने के ??? – user2498079

उत्तर

6

मैं एक ही समस्या थी और के बारे में निम्नलिखित logcat त्रुटि ...skipped x many frames. The application may be doing too much work on its main thread.

बेशक

देखकर मुझे यकीन है कि टीटीएस एक और धागा से बुलाया जा रहा था पर टिप्पणी करने से था जो मैं Thread.currentThread().getName() का उपयोग करके चेक किया गया लेकिन यह पता चला कि OnInit वास्तव में मुख्य थ्रेड पर अभी भी चल रहा था और ऐसा लगता है कि भाषा एक महंगी ऑपरेशन है। एक नया धागा और यूआई ठंड/कोरियोग्राफर में onInit की सामग्री को चलाने के लिए एक त्वरित परिवर्तन बंद कर दिया शिकायत:

@Override 
public void onInit(int status) { 
    new Thread(new Runnable() { 
     public void run() { 
     if(status != TextToSpeech.ERROR) // initialization me error to nae ha 
     { 
      tts.setPitch(1.1f); // saw from internet 
      tts.setSpeechRate(0.4f); // f denotes float, it actually type casts 0.5 to float 
      tts.setLanguage(Locale.US); 
     } 
     } 
    } 
}).start() 
+0

उल्लेख करना भूल गया कि आपको कोड त्रुटि प्राप्त हो सकती है जबतक कि आप अंतिम स्थिति में इनिट स्थिति सेट न करें। – sham

+0

बहुत बहुत धन्यवाद! मैं लंबे समय से इस के साथ संघर्ष कर रहा हूं। टीटीएस प्रारंभिकता हमेशा मेरी यूआई स्क्रीन जमे हुए रखा। इसने कभी मेरे दिमाग को पार नहीं किया है कि मैं ऑन-इन विधि को ओवरराइड कर सकता हूं और इसे थ्रेड में चला सकता हूं। मुझे लगता है कि टीटीएस धीमा होने और मुख्य यूआई थ्रेड को फ्रीजंट करने के लिए यह केवल एक कार्यात्मक समाधान है! –

+1

मैंने इस समाधान की कोशिश की है, लेकिन यह अंग्रेजी के बाहर किसी भी भाषा में काम नहीं करेगा। यह भाषा को सही ढंग से सेट नहीं करेगा – mobilepotato7

संबंधित मुद्दे