使用绑定服务的自定义适配器 - 何时取消绑定?

时间:2012-12-14 22:03:28

标签: android android-adapter aidl

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

问题:我如何知道何时取消绑定服务? Connection对于适配器本身是私有的,检测整个应用程序正在关闭的唯一方法是覆盖unregisterDataSetObserver。或者至少我没有找到另一种方式,并且这个使用内容提供者+内容观察者使用相同的适配器。但不适用于AIDL - 我收到ServiceConnectionLeaked错误。

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

3 个答案:

答案 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初始化您的适配器。有些功能可能是getConnectionisRunning。通过这种方式,您的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

我真的希望这会给你一个暗示。祝你好运!