如何区分元素?

时间:2013-11-23 09:05:44

标签: java android aidl

有一个AIDL接口

interface ISimpleService {
    void register(in ISomeCallback callback);
    void deregister(in ISomeCallback callback);
}

回调是这样定义的

interface ISomeCallback {
    void notify(int event);
}

registerderegister实施中,回调采用LinkedBlockingQueueaddremove方法。问题是通过AIDL传递的具有相同散列的相同对象在AIDL之后(在寄存器和取消注册方法内)具有不同的散列,并且它被视为不同的实例,因此永远不会从队列中删除对象。

如何在删除期间检查对象是否与队列中的对象相同而不添加键(我在更改界面时受限)?

2 个答案:

答案 0 :(得分:1)

您可以尝试覆盖hashCode()实施的equals()ISomeCallback方法。通过它,您可以决定哪些对象是相同的。

答案 1 :(得分:0)

您可以使用RemoteCallbackList< ISomeCallback>来自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