服务泄漏了最初在此绑定的 ServiceConnection

7

我正在使用一个广播接收器来启动IntentService。一切看起来都很顺利,但是我遇到了这个错误,不知道它的来源:

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)

以下是我的广播接收器类:

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);
    }
}

看起来你的SDK出了一些问题。请检查它是否正在建立任何服务连接。 - siva
2个回答

9
该错误消息基本上意味着某个组件创建了一个与Service的绑定,并且在组件销毁之前没有解除与服务的绑定。 您需要提供有关应用程序结构的更多信息,才能更好地回答您的问题。我会猜测一些东西,并给您一些探索的想法。 我猜您正在使用来自Clover和Merchantech的库。或者Clover库使用Merchantech库。我还猜测orderItem 是由Clover定义的类的实例,而不是你定义的。 Android运行时会在onHandleIntent()完成并且没有更多意图请求排队后销毁IntentService。您可以通过向MyIntentService 添加onDestroy()方法,并使用Log命令显示其调用时间来确认此操作。这意味着,在您发布的onHandleIntent()代码中,您的IntentService将在调用addLineItem()后不久被销毁。 堆栈跟踪表明,由于调用orderItem.addLineItem()触发的处理导致绑定到另一个服务。在某个地方,该绑定未被正确管理--也许在应该解除绑定时没有解除绑定。当您的组件(服务或活动)被销毁时,Clover子系统是否有其他期望您执行的“关闭”或“释放”资源的操作?

据我所知,没有。但我会确认一下。 - HiddenDroid

2
解决方案:问题是由于Clover SDK导致的。他们没有取消绑定在com.clover.sdk.v3.order.OrderConnector类中的某个服务。因此,该问题与上述代码片段无关。

应用程序并不是因为那个错误而崩溃,所以我将其保留了下来。也许,Clover SDK 的所有者已经解决了这个问题。我没有检查他们是否这样做了。希望我有所帮助。 - HiddenDroid
我也遇到了同样的问题,无法找到解决办法,让我检查一下并更新最新的 Clover SDK 是否可以解决这个问题? - Rasheed
1
@HiddenDroid,你找到解决方案了吗? - Rasheed
@HiddenDroid,v293还是出现了相同的错误吗?有什么解决方法吗? - Parag Chauhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接