我有这样的AIDL接口服务:
interface Bar {
void doStuff();
// ...
void destroySelf();
}
interface Foo {
// ...
Bar createBar();
}
在服务实现中,Foo
存根维护已创建的Bar
存根的列表,并且在Bar
存根中,当调用destroySelf()
时,此实例将从清单。
我希望被破坏的Bar
实例不再被客户调用,我该怎么做?
此客户端代码不会抛出任何异常:
Bar bar = foo.createBar();
bar.destroySelf();
bar.doStuff(); //I want that to go "boom"
我查看了Binder
实现,并且从destroy()
方法调用了finalize()
本机方法,但只有在垃圾收集器决定唤醒时才调用起来。我甚至不确定Binder
的东西是否保留对BarStub
实例的引用,以便在客户端调用方法时能够访问它们。
答案 0 :(得分:0)
当你说Binder的东西保持对BarStub
实例的引用以便能够随时访问它们时,你是对的。实际上,Binder对象是系统范围内的垃圾收集对象,因此当没有进程可以访问它们时它们就不再存在。
我建议两个选择:
destroySelf()
视为实际销毁对象的东西,而是将其置于不活动的状态。然后,在所有其他方法调用(例如doStuff()
)中检查对象的状态,如果对象处于非活动状态则返回错误。destroySelf()
Bar
。Bar
已被销毁,您可以在其上调用linkToDeath
。但是,我不相信你可以保留它的参考,否则它永远不会被销毁。