19

Backアプリでボタンを押すたびに、LogCat でこの例外を受け取ります。

アクティビティは、もともとここにバインドされていた ServiceConnection com.android.vending.licensing.LicenseChecker@471cc039 をリークしました

このリークの原因となるコードonCreate()は次のとおりです。

mLicenseCheckerCallback = new MyLicenseCheckerCallback();
mChecker.checkAccess(mLicenseCheckerCallback);

どうすればこの漏れを取り除くことができますか?

MyLicenseCheckerCallback をメンバーに割り当てないようにしました。おそらく、アクティビティがonPause()コールバックへの参照になったときに、リークの原因であると考えました。

mChecker.checkAccess(new MyLicenseCheckerCallback());

しかし、それは漏れを取り除きませんでした。

更新:以下の @zapl のコメントのおかげで、Google のLicenseChecker.java:

/** Unbinds service if necessary and removes reference to it. */
private void cleanupService() {
    if (mService != null) {
        try {
            mContext.unbindService(this);
        } catch (IllegalArgumentException e) {
            // Somehow we've already been unbound. This is a non-fatal error.
            Log.e(TAG, "Unable to unbind from licensing service (already unbound)");
        }
        mService = null;
    }
}

最初は呼び出しを怠っているのではないかと思いましたが、再確認したところmChecker.onDestroy();、アクティビティのonDestroy().

私もチェックインonDestroy()しましLicenseChecker.java、呼び出していunbindServiceます:

/**
 * Inform the library that the context is about to be destroyed, so that
 * any open connections can be cleaned up.
 * <p>
 * Failure to call this method can result in a crash under certain
 * circumstances, such as during screen rotation if an Activity requests
 * the license check or when the user exits the application.
 */
public synchronized void onDestroy() {
    cleanupService();
    mHandler.getLooper().quit();
}

それで、実際に何が起こっているのですか?

これは LVL のバグですか?

4

4 に答える 4

6

私はちょうど同じ問題を抱えていました.あなたの更新とzaplのコメントで、問題はあなたが使用しているエミュレータであることがわかりました.

このエミュレーターには Google Play API がなく、LVL はサービスにバインドできず、接続を開いたままにします。最後に、LVL は onDestroy 呼び出しで接続を閉じることができません。

Android xx の代わりに Google API を使用して新しい AVD を作成し、そこでコードを試してください。新しい AVD を作成するときにターゲット プルダウンに Google API が見つからない場合は、Android SDK Manager でダウンロードしてください。

于 2013-10-23T07:16:54.557 に答える
4

後で同じ問題にも遭遇しましたが、そのAndroidパーミッション com.android.vending.CHECK_LICENSE を追加していないことがわかりました。これを修正した後、私の問題は解決されました。この行を Android マニフェストに追加してみてください

<uses-permission android:name="com.android.vending.CHECK_LICENSE" />
于 2012-12-15T13:19:58.413 に答える
0

GoogleのLicenceCheckerについてはわかりませんが、アクティビティを終了する前にStopService()を呼び出す必要があります。そうしないと、サービスが実行されたままになり、メモリリークが発生します。

于 2012-12-15T20:31:27.893 に答える
0

置くだけ

mChecker.onDestroy();

mCheckeronDestroyを宣言して使用するアクティビティのメソッドで。

Google のコードはLicenceChecker次のようになります。

  public synchronized void onDestroy() {
        cleanupService();
        mHandler.getLooper().quit();
    }
于 2012-10-01T21:35:58.710 に答える