2013-11-04 37 views
0

我想在我的android應用程序中的一個單獨的線程中定義一個偵聽器,但是,線程在此之前退出並且不等待要調用的回調函數。android在一個單獨的線程中定義偵聽器

下面的代碼片段:

new Thread(new Runnable() { 
    public void run() { 
    ServiceConnection conn = new ServiceConnection() { 
     public void OnServiceConnected(ComponentName name, IBinder service) { 
     obj = <AIDL interface>.Stub.asInterface(service); 
     } 
     public void onServiceDisconnected(ComponentName name) { 
     obj = null; 
     } 
     Intent intent = new Intent("<service name>"); 
     context.startService(intent); 
     boolean status = context.bindService(intent, conn, Context.BIND_AUTO_CREATE); 
}).start(); 

現在,當從主線程,我開始這個線程等待onServiceConnected()的情況發生,它會等待永遠被永遠不會調用。我也檢查了這個線程的狀態,它說「TERMINATED」。任何想法如何解決這個問題?

+0

在運行方法中,你期望它停止嗎? –

+0

所以基本上我希望線程是活着的,因爲它有監聽器實現。如果它終止,監聽器將永遠不會被調用。 – pree

+0

當線程從run()方法返回時,它被終止。這與它可能創建的對象的生命週期無關。 –

回答

0

您需要重新考慮應用程序的設計。有些問題你應該知道答案:

你需要與服務進行雙向交互,還是隻需要向服務發送「請求」?

在服務中採取的操作是否足以在UI線程中完成,還是需要在單獨的線程中運行?

很有可能您可以通過使用StartService(Intent)發送請求來完成IntentService並與之交互,而無需完全綁定到服務,但是如果沒有上述問題的答案,很難說。

編輯:

在運行方法集m_stopping(一個新的成員變量)設置爲false綁定到服務之前。

發出綁定請求後:

while(!m_stopping) 
{ 
    do_some useful work here (otherwise, why have a thread?) 
    This may include calling unbindService() when you are done. 
} 

而在ServiceConnection :: onServiceDisconnected(組分)方法集m_stopping爲false的執行。

+0

我應該在描述上面的問題時更加清楚。我試圖實現以下內容:startService()和bindService()調用本質上是異步的,我試圖通過將連接監聽器bindService()/ startService()放入不同的線程來實現同步。我可以使用等待/通知機制進行同步。但是我在其中定義連接對象監聽器(onServiceConnected())的線程立即終止(顯然會發生),我試圖弄清楚如何讓它繼續存在。希望解釋我想要做的事情。 – pree

+0

上面的代碼片段沒有等待/通知,因爲在這個時候,我試圖弄清楚我是否可以像上面那樣在線程中實現onServiceConnected(),並保持它運行以獲得回調。 – pree

+0

我無法理解您編輯的答案。我是如何保持包含ServiceConnection監聽器實現的線程活着的?這是你的意思嗎? – pree

相關問題