2016-01-29 36 views
0

我作爲ativity加載到初始化文字轉語音API的對象,但它需要4-5秒的時候我初始化啓動活動我TTS object.I試圖在異步任務和線程對其進行初始化但結果是一樣的。我怎樣才能讓我的活動更快加載?這是我的線程的代碼,它初始化TTS對象。Android的活動的時間太長加載

 class LoadingThread implements Runnable{ 
     @Override 
     public void run() { 
      //load settings of the app 
      appSettings = new AppSettings(getApplicationContext()); 
      appSettings.loadSettings(); 
      //making ready TTS before the user interact with it 
      textToSpeech = new TextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() { 
       @Override 
       public void onInit(int status) { 
        ttsOptions = new HashMap<String, String>(); 
        ttsOptions.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,ActivityMain.UTTER_ID); 
        textToSpeech.setLanguage(Locale.ENGLISH); 
        textToSpeech.setSpeechRate(AppSettings.getSpeakerSpeed()); 
       } 
      }); 
      textToSpeech.setOnUtteranceCompletedListener(new TextToSpeech.OnUtteranceCompletedListener() { 
       @Override 
       public void onUtteranceCompleted(String s) { 
        ActivityMain.mNotepad.onStopSpeaker(s); 
       } 
      }); 
     } 
    } 

我打電話給我的活動)中的onResume這個線程(如

LoadingThread thread = new LoadingThread(); 
     thread.run(); 
+0

你可以發佈你的整個的onCreate請與XML的活動。 – apmartin1991

+0

您是否在真實設備上嘗試過您的應用?因爲模擬器可能有足夠多的時間啓動。 – katmanco

+0

@katmanco我用我的真實設備而不是虛擬設備 –

回答

0

的應用class是錯誤的地方這樣做。如果您願意,可以使用應用程序的onCreate()方法啓動Service。你應該在一個Service實現這個後臺線程,爲Service的目的是做事情的背景。應用程序class應該很少使用。這是維持少量全球狀態的最後手段。

將此代碼移動到Service後,Android已經爲您調用了Looper.prepare()

當他調用FileManager類的構造函數時,OP實際上試圖在Thread內部創建一個Handler。雖然我上面的評論仍然是真的,但是與OP的問題無關,因爲他是在繼承Activity而不是Application。

爲了說清楚,實際的問題是他在一個尚未調用Looper.prepare()(通過新的FileManager())的Thread中創建Handler。正確的修復方法是在主線程上創建Handler,即在ActivityService callbacks之一中。

0

你開始你的線程錯誤,你只需要調用Runnable接口的它執行同一線程的run方法。 如果你需要在單獨的線程中運行使用它:

new Thread(new LoadingThread()).start(); 

而且很可能你會在這裏得到的例外,因爲這需要在主線程上運行:

ActivityMain.mNotepad.onStopSpeaker(s); 

你需要使用Handler或Activiy.runOnUiThread()方法來處理此操作

0

您需要致電new Thread(runnable).start()才能在不同的線程上運行它,而不是在runnable.run()上運行它。