服务泄露了最初绑定在这里的ServiceConnection

时间:2015-07-08 15:00:53

标签: android service broadcastreceiver intentservice

我正在使用启动IntentService的BraodCastReceiver。 Everythings看起来运作良好,但是我得到了这个错误,我不知道它的来源:

android.app.ServiceConnectionLeaked: Service     com.merchantech.app.smartdiscount.MyIntentService has leaked ServiceConnection  com.clover.sdk.v3.order.OrderConnector@535008f4 that was originally bound here
        at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:969)
        at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:863)
        at android.app.ContextImpl.bindService(ContextImpl.java:1426)
        at android.app.ContextImpl.bindService(ContextImpl.java:1415)
        at android.content.ContextWrapper.bindService(ContextWrapper.java:473)
        at com.clover.sdk.v1.ServiceConnector.connect(ServiceConnector.java:119)
        at com.clover.sdk.v1.ServiceConnector.waitForConnection(ServiceConnector.java:148)
        at com.clover.sdk.v1.ServiceConnector.execute(ServiceConnector.java:209)
        at com.clover.sdk.v3.order.OrderConnector.getOrder(OrderConnector.java:153)
        at com.merchantech.app.smartdiscount.MyIntentService.onHandleIntent(MyIntentService.java:41)
        at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.os.HandlerThread.run(HandlerThread.java:60)

这是我的BrodcastReceiver类:

public class MyReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (action.equals("com.test.intent.action.LINE_ITEM_ADDED")) {
            Intent i = new Intent(context, MyIntentService.class);
            context.startService(i);
        }
    }
}

这是我的IntentService类:

public class MyIntentService extends IntentService {

    public MyIntentService() {
        super("MyIntentService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        orderItem.addLineItem(orderId, lineItemId, var);
    }
}

2 个答案:

答案 0 :(得分:8)

错误消息基本上意味着某个组件创建了对Service的绑定,并且在组件被销毁之前没有从服务中解除绑定。

您需要提供有关应用结构的更多信息,以便更好地回答您的问题。我会做一些猜测,也许会给你一些关于要探索的事情的想法。

我猜你正在使用Clover的库,也许还有Merchantech。或者Clover库可能使用Merchantech库。我也猜测orderItem是Clover定义的类的实例,而不是你。

Android运行时在IntentService完成后销毁onHandleIntent()并且没有更多的Intent请求排队。您可以通过使用Log命令将onDestroy()方法添加到MyIntentService来确认,以显示何时调用它。这意味着在您为onHandleIntent()发布的代码中,您的IntentService将在调用addLineItem()后很快销毁。

堆栈跟踪表明由orderItem.addLineItem()调用触发的处理会导致绑定到另一个服务。在某个地方,这种绑定没有得到妥善管理 - 也许在它应该没有解除时。当您的组件(服务或活动)被销毁时,Clover子系统是否期望您“关闭”它或“释放”资源?

答案 1 :(得分:2)

<强>解决

问题是由Clover SDK引起的。它们没有解除绑定在com.clover.sdk.v3.order.OrderConnector类中某处的服务。所以问题与上面的代码片段无关。