web-dev-qa-db-ja.com

元々ここにバインドされていたServiceConnectionがサービスからリークされました

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

解決済み

問題はCloverSDKが原因です。 com.clover.sdk.v3.order.OrderConnectorクラスのどこかでバインドされていたサービスのバインドを解除していません。したがって、この問題は上記のコードスニペットとは関係ありません。

2
HiddenDroid

エラーメッセージは基本的に、一部のコンポーネントがServiceへのバインディングを作成し、コンポーネントが破棄される前にサービスからバインド解除されなかったことを意味します。

質問に対するより良い回答を得るには、アプリの構造に関する詳細情報を提供する必要があります。私はいくつかの推測をします、そして多分あなたに探求することについてのいくつかの考えを与えるでしょう。

あなたはクローバーのライブラリを使用していると思いますが、おそらくマーチャンテックも使用しています。あるいは、クローバーライブラリがMerchantechライブラリを使用しているのかもしれません。また、orderItemは、あなたではなく、Cloverによって定義されたクラスのインスタンスであると推測しています。

Androidランタイムは、onHandleIntent()が完了し、キューに入れられたインテントリクエストがなくなった後、IntentServiceを破棄します。これはonDestroy()を追加することで確認できます。 MyIntentServiceへのメソッドとLogコマンドを使用して、呼び出されたときに表示します。つまり、onHandleIntent()に投稿したコードでは、addLineItem()が完了します。

スタックトレースは、orderItem.addLineItem()の呼び出しによってトリガーされた処理が別のサービスへのバインディングを引き起こすことを示唆しています。どこかで、そのバインディングが適切に管理されていません。必要なときにバインドが解除されていない可能性があります。コンポーネント(サービスまたはアクティビティ)が破棄されているときに、Cloverサブシステムがリソースを「閉じる」または「解放する」ことを期待していることはありますか?

9
Bob Snyder