设置:将数据提供到ListView
的自定义适配器。数据基于外部服务计算的一些数字。我正在使用AIDL来绑定服务并获取我需要的数据。
问题:我如何知道何时取消绑定服务? Connection对于适配器本身是私有的,检测整个应用程序正在关闭的唯一方法是覆盖unregisterDataSetObserver
。或者至少我没有找到另一种方式,并且这个使用内容提供者+内容观察者使用相同的适配器。但不适用于AIDL - 我收到ServiceConnectionLeaked
错误。
我知道我可以在我的适配器中添加一个“unbindFromService”方法并从我的活动的onDestroy()中调用它,但这对我来说不够优雅。如果可能的话,我更喜欢一些“诚实”的触发器。
答案 0 :(得分:2)
在CustomAdapter中实施ActivityLifecycleCallbacks
,然后在您的活动电话中
mAdapter.setActivity(this);
适配器类
public class CustomAdapter extends ArrayAdapter<String> implements ActivityLifecycleCallbacks{
Activity mActivity;
public void setActivity(Activity activity) {
/* or you could remove setactivity and do below operation in Constructor */
mActivity = activity;
mActivity.getApplication().registerActivityLifecycleCallbacks(this);
}
@Override
public void onActivityDestroyed(Activity activity) {
/*unregister so that you do not get callbacks after activity is destroyed*/
if(activity instanceof MainActivity)
mActivity.getApplication().unregisterActivityLifecycleCallbacks(this);
/*unregister your activity or in any other callbacks*/
}
/* skipped other dummy functions*/
}
答案 1 :(得分:1)
Connection is private to adapter
错了。 适配器是无上下文的,因此服务不应该是适配器的私有 。
如果没有Context,您的适配器将永远无法绑定到服务。本质上,您有一个函数为您的适配器提供绑定到服务的Context。因此,绑定连接对您的适配器不是私有的:它是允许其创建的Context传递。
真正的问题是AFAIK没有办法听取上下文。意思是,假设您在适配器中保存了上下文实例:无法允许适配器监听此上下文并以某种方式知道Activity已完成。这会让您接受不够优雅的解决方案:您的活动应该通知正在使用其上下文的适配器!否则,你最终会得到一个更加黑客攻击的解决方案。
请注意,评论中的整个辩论涉及您的“服务是适配器私有”的东西。实际上,执行此操作的优雅方法是使用ServiceProvider接口提供连接,这将由您的活动实现。您应该使用传递的ServiceProvider初始化您的适配器。有些功能可能是getConnection
和isRunning
。通过这种方式,您的Activity将在适配器使用它时处理连接。 (的 同步 强>)
答案 2 :(得分:1)
我会使用服务将新数据插入SQLite表或刷新ContentProvider,然后使用SimpleCursorAdapter(向后兼容的android.support.v4.widget.SimpleCursorAdapter)和LoaderManager,SQLiteCursorLoader / CursorLoader,Loader用于在List或ListFragment上显示数据的模式。
Android SDK没有提供SQLiteCursorLoader,但是Mark Murphy在GitHub中有一个,所以如果你想在本地SQLite DB中保存新数据,你可以看看它。
由于服务可以独立于SQLite中的基础数据和列表的适配器,因此您可以在完成插入新数据或刷新提供程序时解除绑定,以便您可以使用推荐的模式解除绑定服务(请参阅此问题:Android: How to safely unbind a service)并查看http://developer.android.com/reference/android/app/Service.html#ProcessLifecycle。
我真的希望这会给你一个暗示。祝你好运!