2014-06-26 68 views
0

我有一個Android應用程序有三個線程,主線程和兩個工作線程。這些線程需要定期互相通信。調試一個凍結的Android應用程序

我原本是以一種可怕的方式去做這件事,這裏的每個人都會嚷嚷我。我保存了每個線程中的線程實例,並在線程需要該功能時從其他線程調用該類的方法。它有效,但我知道這是不對的。

因爲這是錯誤的,我回去並將線程的每個實例更改爲線程處理程序的實例,並且每個線程函數調用我用一個handler.sendMessage調用替換。

現在該程序不起作用。它只是凍結,我不知道發生了什麼。當使用調試透視圖時,我逐步通過主線程,但我得到的是功能

boolean hasMessages(Handler h, int what, Object object) 
{ 
... 
} 

from MessageQueue。其他線程在run()函數中循環,這些函數沒有做任何令人興奮的事情。我的日誌都沒有打印。我對正在發生的事情感到不知所措,我不知道下一步應該採取什麼措施繼續進行調試。我改變的只是添加處理程序和發送消息。你們可以提出我應該採取的任何調試步驟嗎?

編輯:下面是一些代碼,我有沒有運氣

主要活動:

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_main); 
    connectionStatusTextView = (TextView) findViewById(R.id.connectionStatus); 
    imageView = (ImageView) findViewById(R.id.imageView); 
    commandView = (TextView)findViewById(R.id.commandView); 
    focusView = (TextView)findViewById(R.id.focusView); 
    mApplication = ((myApplication) this.getApplication()); 

    ConnectedThread connectedThread = new ConnectedThread(mHandler, mApplication); 
    VoiceRecognitionThread voiceThread = new VoiceRecognitionThread(mApplication, this); 

    connectedThread.setHandlers(mHandler, voiceThread.getHandler()); 
    voiceThread.setHandlers(mHandler, connectedThread.getHandler()); 

    connectedThread.start(); 
    voiceThread.start(); 
} 

ConnectedThread和VoiceRecognitionThread都擴展HandlerThread。它們都創建一個處理髮送給這些線程的消息的類級處理程序。 getHandler返回對這些處理程序的引用。

+0

你有備份嗎? –

+0

你有密碼嗎? – 323go

+0

@MatiCicero我有一個備份,但由於代碼違反約定,我寧願解決這個問題,而不是回到工作,但不正確的版本 – RoboCop87

回答

1

只需使用一個HandlerThread並通過其處理的對象與信息餵它:

HandlerThread thread1 = new HandlerThread("Thread Name"); 
thread1.start(); 
handler1 = new MyHandler(thread1.getLooper()); 

// pass message for thread 1 
handler1.sendmessage() 

// and same for threads 2 and 3 

請注意,如果你計劃你的線程長時間運行,好得多 的解決辦法是使用IntentService

IntentService是服務,因此,不太容易受到Android回收的影響,那麼資源會變得很低。

+0

感謝您的回答吉拉德,我避開了使用服務或IntentService,因爲他們似乎按照主線程給予他們工作的原則工作,他們完成工作並返回答案。對於我的應用程序,我需要一個線程輪詢一個藍牙緩衝區,另一個線程偵聽語音命令並在發出語音命令時執行操作。除了開始之外,他們沒有從UI線程獲得任何工作請求 – RoboCop87