Как отличить элементы?
Есть интерфейс AIDL
interface ISimpleService {
void register(in ISomeCallback callback);
void deregister(in ISomeCallback callback);
}
Обратный вызов определяется таким образом
interface ISomeCallback {
void notify(int event);
}
в register
а также deregister
обратные вызовы реализации помещаются в LinkedBlockingQueue
через add
а также remove
методы. Проблема заключается в том, что один и тот же объект с тем же хешем, переданным через AIDL, имеет другой хеш после AIDL (внутри методов регистрации и отмены регистрации) и обрабатывается как другой экземпляр, поэтому объекты никогда не удаляются из очереди.
Как я могу проверить во время удаления, что объект такой же, как тот, который находится в очереди, без добавления ключей (я ограничен в изменении интерфейса)?
2 ответа
Вы можете попробовать переопределить hashCode()
а также equals()
методы вашего ISomeCallback
Реализации. Таким образом, вы можете решить, какие объекты одинаковы.
Вы можете использовать RemoteCallbackList
public class SimpleService extends ISimpleService.Stub {
RemoteCallbackList<ISomeCallback> mLists =
new RemoteCallbackList<ISomeCallback>();
...
public void register(ISomeCallback callback) {
mLists.register(callback);
}
public void unregister(ISomeCallback callback) {
mLists.unregister(callback);
}
}
Этот класс уже ориентирован на многопотоковое исполнение, поэтому я думаю, что он будет работать без проблем для ваших проблем. Пожалуйста, обратите внимание, что он основан на вашей ссылке, а не на хеш-коде. Если вы передаете разные объекты с хеш-кодом, он не будет рассматриваться как один и тот же объект.
Ссылка: http://developer.android.com/reference/android/os/RemoteCallbackList.html