使用绑定服务的自定义适配器-何时解除绑定



设置:将数据馈送到ListView的自定义适配器。数据基于外部服务计算的一些数字。我正在使用AIDL绑定服务并获取我需要的数据。

问题:我如何知道何时解除服务绑定?连接对适配器本身是私有的,检测整个应用程序正在关闭的唯一方法是重写unregisterDataSetObserver。或者至少我并没有找到另一种方法,而且这个方法和使用内容提供者+内容观察者的同一适配器配合得很好。但不适用于AIDL-我收到了ServiceConnectionLeaked错误。

我知道我可以在我的适配器中添加一个"unbindFromService"方法,并从活动的onDestroy()调用它,但这对我来说不够优雅。如果可能的话,我更喜欢一些"诚实"的触发器。

在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*/
}

Connection is private to adapter错误Adapter是无上下文的,因此服务不应该是适配器的私有服务

如果没有上下文,您的适配器将永远无法绑定到服务。本质上,您有一个函数,它为您的适配器提供一个上下文,以便绑定到服务。因此,绑定连接对适配器来说不是私有的:是传递的上下文允许创建它。

真正的问题是,AFAIK没有办法倾听上下文。也就是说,假设您将上下文实例保存在适配器中:没有办法允许适配器侦听此上下文并以某种方式知道"活动"已经完成。这会导致您接受不够优雅的解决方案:您的活动应该通知正在使用其上下文的适配器!否则,你最终会得到一个更破解的解决方案。


请注意,评论中的整个争论都是关于您的"服务对适配器是私有的"之类的。事实上,实现这一点的优雅方法是使用ServiceProvider接口来提供连接,并且这将由您的活动来实现。应该使用传递的ServiceProvider初始化适配器。一些函数将是getConnectionisRunning。通过这种方式,适配器使用连接时,"活动"将负责连接。(同步)

我会使用服务将新数据插入SQLite表或刷新ContentProvider,然后使用SimpleCursorAdapter(android.support.v4.widget.SimpleCursorAdapter,向后兼容)和LoaderManager、SQLiteCursorLoader/CursorLoader、Loader模式在List或ListFragment上显示数据。

SQLiteCursorLoader不是由Android SDK提供的,但Mark Murphy在GitHub中有一个,所以如果你想在本地SQLite数据库中保存新数据,你可以看看它。

由于服务可以独立于SQLite中的底层数据和列表的适配器,您可以在插入新数据或刷新提供程序后解除绑定,这样您就可以按照建议的模式解除服务绑定(请参阅此问题:Android:如何安全地解除服务绑定),并查看http://developer.android.com/reference/android/app/Service.html#ProcessLifecycle.

我真的希望这能给你一个提示。祝你好运

最新更新