2013-04-09 1 views
0

Есть ли способ определить, умер ли процесс? У меня есть системная служба, которая хранит информацию о каждом клиенте, который подключается к ней. Когда процесс, в котором размещается этот клиент, умирает, я бы хотел очистить свой кеш. Я искал по всему Google, но кажется, что это невозможно :(Определение того, закончился ли процесс?

Одним из решений, с которым я столкнулся, является использование ссылки LinkToDeath от Binder, но этот дизайн не очень хорошо работает с моим текущим дизайном. Есть ли альтернатива?

Благодаря

+0

Что значит «не сетка хорошо»? – dcow

ответ

0

состояние Thread можно определить с помощью метода IsAlive() на эту тему, или использовать GetState(), чтобы определить состояние потока более точно.

Binder имеет метод isBinderAlive(), но Я не использовал его, поэтому не могу добавить ничего открытого в официальных документах.

+0

Спасибо за идею. Тем не менее, я считаю, что это только скажет мне, если текущая тема умерла. Я надеялся на решение, которое скажет мне, умер ли весь процесс. – Jon

0

Подход использования linkToDeath является единственным, о котором я знаю.

Обычно вот что я хотел бы сделать:

  • Есть класс, IMySystemService.aidl который реализуется с помощью вашей службы системы.
  • У вас есть слушатель, IMySystemServiceListener.aidl, который реализуется каждым клиентом.
  • Добавить способ, такой как IMySystemService.addListener(IMySystemServiceListener listener)

Затем используйте linkToDeath на слушателя в вашей системной службы, чтобы получить функцию обратного вызова для того, когда каждый клиент умирает. Затем вы можете очистить соответствующие части вашего кеша.

Если ваш проект совсем не сложный, у вас, вероятно, уже есть подходящий слушатель для каждого клиента?

Вы можете ответить, почему linkToDeath не подходит для вашего дизайна?

Один общий шаблон для кешей - использовать WeakHashMap для вашего кеша - но это работает только в том случае, если у вас есть ключевой объект, который собирает мусор, когда клиент исчезает. Я считаю, что это, в свою очередь, может быть достигнуто только с помощью linkToDeath, поэтому мы вернемся к тому, с чего мы начали!