2012-07-17 33 views
0

在我的Android應用程序中,我使用TTS和語音識別。儘管使用了所有可用的回調來了解它們所處的狀態,但我仍然遇到了無法處理的情況。示例:過程或方法的監視時間已過

1)TTS報告成功初始化,但未能說話(某些自定義TTS引擎的已知問題(未提及名稱))。

2)首次成功連接後,網絡訪問會丟失,這可能導致在網絡錯誤返回之前出現大量延遲。

還有其他的情況,我不會讓你生氣。

我已閱讀並消化時間監控線程如thisthis讓我明白瞭如何準確判斷X & Y之間的時間,但它是一個監測方法是我後,我可以到當反應設定限制達到。

原諒我的僞代碼,但我認爲我的手,我不知道從哪裏開始對這個..

public boolean methodSuccess = false; 

    public void troublesomeMethod() { 
    if(// everything completed and I got a usual result) { 
    methodSuccess = true; 
    } 

    public boolean timeMonitor(int maxDuration) { 

    // use System.currentTimeMillis() here as start value 

    // monitor time elapsed here in loop 
    // monitor methodSuccess in loop 
    // return false if methodSuccess is set to true whilst in loop 

    // break if maxDuration reached and return true 

    } 

再次,藉口上面的代碼,我根本想不出如何實現這個...

另外,如果我開始在上面:

boolean monitorThis = timeMonitor(5000); // let me know when 5 seconds have passed 
    startTroublesomeMethod(); // the one I want to monitor 

那麼這將是毫無意義的,如果我不得不在布爾響應「等待」 startTroublesomeMethod前返回()實際上開始了!或troublesomeMethod開始之前,我開始監視它...

if(monitorThis) { 
    // react to lagging method by destroying TTS or Listener Object 
    } else { 
    // the troublesomeMethod behaved normally - do nothing 
    } 

我在困惑希望我已經成功地表達我想要實現的。

我事先感謝您的幫助。

回答

1

您可以使用Handler發佈延遲檢查。例如:

Handler mHandler = new Handler(); 
    mHandler.postDelayed(new Runnable() { 
     @Override public void run() { 
      // You can set a flag or if you run your method 
      // on another thread, you can interrupt that thread. 
     } 
    }, 5000); 

請記住,在處理程序設置爲它創建的同一個線程如果你想監控的方法是在同一個線程中運行的,你可能有問題。在另一個線程中調用您的方法,並保留對該線程的引用以在必要時中斷它。

Thread mThread = new Thread(new Runnable() { 
     @Override public void run() { 
      // Call your method here and keep a reference to this thread. 
     } 
    }); 
    mThread.run(); 
+0

這看起來不錯,謝謝。我需要一段時間來了解如何保持對線程的引用或者實際上中斷它,但是我會回過頭來,並且在我的頭腦周圍標記出正確的答案(當然它也是有效的! )。乾杯 – brandall 2012-07-17 14:52:26

+0

它工作完美。謝謝。標記爲正確。 – brandall 2012-07-28 21:51:11