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クラスです:
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);
}
}
解決済み:
問題はCloverSDKが原因です。 com.clover.sdk.v3.order.OrderConnectorクラスのどこかでバインドされていたサービスのバインドを解除していません。したがって、この問題は上記のコードスニペットとは関係ありません。
エラーメッセージは基本的に、一部のコンポーネントがService
へのバインディングを作成し、コンポーネントが破棄される前にサービスからバインド解除されなかったことを意味します。
質問に対するより良い回答を得るには、アプリの構造に関する詳細情報を提供する必要があります。私はいくつかの推測をします、そして多分あなたに探求することについてのいくつかの考えを与えるでしょう。
あなたはクローバーのライブラリを使用していると思いますが、おそらくマーチャンテックも使用しています。あるいは、クローバーライブラリがMerchantechライブラリを使用しているのかもしれません。また、orderItem
は、あなたではなく、Cloverによって定義されたクラスのインスタンスであると推測しています。
Androidランタイムは、onHandleIntent()
が完了し、キューに入れられたインテントリクエストがなくなった後、IntentService
を破棄します。これはonDestroy()
を追加することで確認できます。 MyIntentService
へのメソッドとLogコマンドを使用して、呼び出されたときに表示します。つまり、onHandleIntent()
に投稿したコードでは、addLineItem()
が完了します。
スタックトレースは、orderItem.addLineItem()
の呼び出しによってトリガーされた処理が別のサービスへのバインディングを引き起こすことを示唆しています。どこかで、そのバインディングが適切に管理されていません。必要なときにバインドが解除されていない可能性があります。コンポーネント(サービスまたはアクティビティ)が破棄されているときに、Cloverサブシステムがリソースを「閉じる」または「解放する」ことを期待していることはありますか?