服务泄露了最初绑定在这里的 ServiceConnection
Service has leaked ServiceConnection that was originally bound here
我正在使用启动 IntentService 的 BraodCastReceiver。一切看起来都很好,但我收到这个错误,我不知道它的来源:
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 class:
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 class:
public class MyIntentService extends IntentService {
public MyIntentService() {
super("MyIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
orderItem.addLineItem(orderId, lineItemId, var);
}
}
该错误消息基本上意味着某些组件创建了对 Service
的绑定,并且在该组件被销毁之前没有与服务解除绑定。
您需要提供有关应用程序结构的更多信息,以便更好地回答您的问题。我会做一些猜测,也许会给你一些关于要探索的东西的想法。
我猜您正在使用来自 Clover 的库,也许还有 Merchantech。或者 Clover 库可能使用 Merchantech 库。我还猜测 orderItem
是 Clover 定义的 class 的一个实例,而不是你。
Android 运行时在 onHandleIntent()
完成并且没有更多 Intent 请求排队后销毁 IntentService
。您可以通过将 onDestroy()
方法添加到您的 MyIntentService
来确认这一点,并使用 Log 命令显示它何时被调用。这意味着在您为 onHandleIntent()
发布的代码中,您的 IntentService 将在对 addLineItem()
的调用完成后很快被销毁。
堆栈跟踪表明调用 orderItem.addLineItem()
触发的处理导致绑定到另一个服务。在某个地方,该绑定没有得到适当的管理——可能在应该解除绑定的时候没有解除绑定。当您的组件(服务或 Activity)被销毁时,Clover 子系统是否希望您对 "close" 它或 "release" 资源做些什么?
已解决:
问题出在Clover SDK。他们没有解除绑定在 com.clover.sdk.v3.order.OrderConnector Class 某处的服务。所以问题与上面的代码片段无关。
我正在使用启动 IntentService 的 BraodCastReceiver。一切看起来都很好,但我收到这个错误,我不知道它的来源:
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 class:
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 class:
public class MyIntentService extends IntentService {
public MyIntentService() {
super("MyIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
orderItem.addLineItem(orderId, lineItemId, var);
}
}
该错误消息基本上意味着某些组件创建了对 Service
的绑定,并且在该组件被销毁之前没有与服务解除绑定。
您需要提供有关应用程序结构的更多信息,以便更好地回答您的问题。我会做一些猜测,也许会给你一些关于要探索的东西的想法。
我猜您正在使用来自 Clover 的库,也许还有 Merchantech。或者 Clover 库可能使用 Merchantech 库。我还猜测 orderItem
是 Clover 定义的 class 的一个实例,而不是你。
Android 运行时在 onHandleIntent()
完成并且没有更多 Intent 请求排队后销毁 IntentService
。您可以通过将 onDestroy()
方法添加到您的 MyIntentService
来确认这一点,并使用 Log 命令显示它何时被调用。这意味着在您为 onHandleIntent()
发布的代码中,您的 IntentService 将在对 addLineItem()
的调用完成后很快被销毁。
堆栈跟踪表明调用 orderItem.addLineItem()
触发的处理导致绑定到另一个服务。在某个地方,该绑定没有得到适当的管理——可能在应该解除绑定的时候没有解除绑定。当您的组件(服务或 Activity)被销毁时,Clover 子系统是否希望您对 "close" 它或 "release" 资源做些什么?
已解决:
问题出在Clover SDK。他们没有解除绑定在 com.clover.sdk.v3.order.OrderConnector Class 某处的服务。所以问题与上面的代码片段无关。