3

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

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

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

4

3 回答 3

4

在您的 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*/

}
于 2013-02-20T20:37:32.060 回答
1

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

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

真正的问题是 AFAIK 没有办法听上下文。意思是,假设您在适配器中保存了上下文实例:没有办法让适配器侦听此上下文并以某种方式知道 Activity 已完成。这导致您接受不够优雅的解决方案:您的活动应该通知正在使用其上下文的适配器!否则,您最终会得到一个更加复杂的解决方案。


请注意,评论中的整个辩论都与您的“服务对适配器私有”有关。实际上,执行此操作的优雅方法是拥有一个提供连接的 ServiceProvider 接口,这将由您的活动实现。您的适配器应该使用传递的 ServiceProvider 进行初始化。一些函数是getConnectionisRunning。这样,您的 Activity 将在 Adapter 使用它时处理连接。(同步

于 2013-02-20T08:42:47.350 回答
1

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

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

由于服务可以独立于 SQLite 中的基础数据和列表的适配器,因此您可以在完成插入新数据或刷新提供程序时取消绑定它,以便您可以继续使用推荐的模式来取消绑定服务(请参阅此问题:Android:如何安全地取消绑定服务)并查看http://developer.android.com/reference/android/app/Service.html#ProcessLifecycle

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

于 2013-02-21T06:37:38.093 回答