有一个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之后(在寄存器和取消注册方法内)具有不同的散列,并且它被视为不同的实例,因此永远不会从队列中删除对象。
如何在删除期间检查对象是否与队列中的对象相同而不添加键(我在更改界面时受限)?
答案 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