2013-02-12 66 views
1

對於Application對象,我打電話bindService()onServiceConnected()回調收到IBinder對象,並將其交給AsyncTaskAndroid:如何取消/中斷同步服務呼叫?

在那裏,我通過調用ServiceClass.Stub.asInterface(iBinderObject)來獲取我的服務對象,並使用此服務對象調用某種方法服務對象

這是一個同步方法不能影響服務的超時設置(誰知道它的超時的實現是否可靠)。所以,事先,我在自己的超時處理程序在一個單獨的線程上。

超時代碼調用unbindService()將應用程序從服務中解除綁定併產生超時結果。

如果超時運行第一,我還沒有找到一種方法來中斷服務調用。對此,unbindService()沒有明顯的影響。調用AsyncTask.cancel(true)也不會改變。 IBinder對象似乎沒有提供任何可能有幫助的明顯方法。

我觀察到AsyncTask一直在等待服務呼叫返回,這可以使標準Executor顯着延遲下一個AsyncTask的開始。

任何經驗?想法?

+0

你有沒有檢查你的AsyncTask裏面是否使用AsyncTask.isCancelled()來取消它。如果你使用它,你可以簡單地完成你的AsyncTask, – 2013-02-12 15:20:52

+0

@GauravArora感謝您的評論。正如我所說的,我想打斷一個同步服務呼叫,我不能影響其中的代碼。 – 2013-02-12 15:22:27

+0

通常,不能取消同步呼叫。這就是爲什麼他們是同步的。但是你可以嘗試在你的超時處理程序啓動後停止服務。 – 2013-02-12 15:32:06

回答

1

正如其他人所指出的,同步呼叫不能被中斷。

如果這是一個問題,你必須在服務API的設計任何輸入,您可以使用一對單向的AIDL接口執行異步操作,像這樣:

package sample; 
oneway interface IServer { 
    void doWork(IClient cb); 
} 

package sample; 
oneway interface IClient { 
    void reportResult(String result); 
}