Как отличить элементы?

Есть интерфейс 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 из Android API для хранения вашего обратного вызова. В вашем примере это будет выглядеть так:

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

Другие вопросы по тегам