2013-04-09 155 views
0

有沒有辦法確定進程是否已經死亡?我有一個系統服務,存儲連接到它的每個客戶端的信息。當託管該客戶端的進程死亡時,我想清理我的緩存。我搜索了谷歌的所有,但似乎這是不可能的:(確定過程是否已經死亡?

我碰到的一個解決方案是使用Binder的linkToDeath,但該設計不與我目前的設計網格很好。

感謝

+0

你是什麼意思「網狀不好」? – dcow 2013-04-09 05:23:37

回答

0

線程可以使用的IsAlive()方法,此主題確定,或使用的getState()確定線程狀態更精確的狀態。

粘合劑的方法isBinderAlive(),但我沒有使用它,所以不能添加任何在官方文檔中發現的東西。

+0

感謝您的想法。但是,我相信只會告訴我目前的線程是否已經死亡。我希望有一個解決方案能告訴我整個過程是否已經死亡。 – Jon 2013-04-11 17:36:17

0

使用linkToDeath的方法是我所知道的唯一方法。

通常這裏就是我會做:

  • 有一個類,IMySystemService.aidl這是由您的系統服務來實現。
  • 有一位聽衆,IMySystemServiceListener.aidl這是由每個客戶端實施。
  • 添加這樣的方法IMySystemService.addListener(IMySystemServiceListener listener)

然後,使用linkToDeath您的系統服務中的聽衆獲得當每個客戶死亡的回調。然後,您可以清理緩存的相關部分。

如果您的項目已經非常複雜,那麼您可能已經有一些合適的每客戶端偵聽器了?

你能回答爲什麼linkToDeath不適合你的設計?

緩存的一種常見模式是使用WeakHashMap作爲緩存 - 但這隻有在客戶端消失時垃圾收集的密鑰對象纔有效。我相信這隻能使用linkToDeath才能實現,所以我們回到了我們開始的地方!

相關問題