【发布时间】:2012-12-14 22:03:28
【问题描述】:
设置:将数据输入ListView 的自定义适配器。数据基于外部服务计算的一些数字。我正在使用 AIDL 来绑定服务并获取我需要的数据。
问题:我如何知道何时解除绑定服务?连接对适配器本身是私有的,检测整个应用程序正在关闭的唯一方法是覆盖unregisterDataSetObserver。或者至少我没有找到另一种方法,并且这个方法与使用内容提供者+内容观察者的相同适配器配合得很好。但不适用于 AIDL - 我收到 ServiceConnectionLeaked 错误。
我知道我可以向我的适配器添加一个“unbindFromService”方法并从我的活动的 onDestroy() 中调用它,但这对我来说不够优雅。如果可能的话,我更喜欢一些“诚实”的触发器。
【问题讨论】:
-
为什么服务连接是私有的并且在适配器中使用?您可以在活动级别处理它并仅将数据传递给适配器吗?然后你可以在 Activity 的 onCreate/onDestroy 上使用 bind/unbind。
-
数据不仅来自服务,还需要请求。适配器知道它需要哪些数据,其他人都不知道。
-
这意味着您的适配器应该从其他一些组件(例如,Activity)请求数据,然后应该获取数据。只是对Single Responsibility Principle 的一些重构和使用。适配器通常只负责渲染数据和一些事件处理,比如 onItemClick 等。您可以在适配器级别处理连接(就像您所描述的那样),但它不会很优雅。希望它会有所帮助。
-
适配器是唯一需要该数据的组件,也是唯一知道如何处理它的组件。我的应用程序的早期版本通过活动使用“集中式”服务访问,但现在只有适配器正在使用服务。我不喜欢通过将连接对象移动到活动来添加另一层间接的想法。
-
那我没有什么要补充的了。我在Bound services doc 中找到的最后一件事,请参阅附加说明部分:
You should usually pair the binding and unbinding during matching bring-up and tear-down moments of the client's lifecycle
标签: android android-adapter aidl