1

SpenSurfaceView を Android レイアウト コンポーネントでオーバーレイする画面があります。ユーザーが画面を切り替えて別のコンポーネントをロードすると、古いコンポーネントがこのクラスにリークします。

MAT (Memory Analyzer T) によるネイティブ スタックからの com.samsung.android.sdk.pen.engine.SpenInView

オーバーレイされたコンポーネントは、ストロークの形でユーザー入力を受け取るカスタム コントローラーです。これらには SurfaceView への参照がありますが、コンポーネントが削除される前に null になります。

アプリケーションを完全に終了しても問題は残ります。

PenSample5_6_TextRecognition の例を参照として使用しています。

これは、Samsung Mobile SDK ( http://developer.samsung.com/samsung-mobile-sdk )を使用しています。

このメモリリークを追跡し続けるには、どのような戦略を採用する必要がありますか? SDK の NDK 側は、クローズド ソースである可能性があります。

SpenObjectBase は SpenSurfaceView への参照を保持していますか?

私よりも評判の良い誰かが「spen sdk」タグを作成できますか。

4

1 に答える 1

0

onDestroy()サンプルアプリからご確認ください。すべてのリソースを閉じますか?

@Override
protected void onDestroy() {
    super.onDestroy();

    if (mTextRecognition != null) {
        mSpenTextRecognitionManager.destroyRecognition(mTextRecognition);
        mSpenTextRecognitionManager.close();
    }

    if (mSpenSurfaceView != null) {
        mSpenSurfaceView.closeControl();
        mSpenSurfaceView.close();
        mSpenSurfaceView = null;
    }

    if(mSpenNoteDoc != null) {
        try {
            mSpenNoteDoc.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        mSpenNoteDoc = null;
    }
}

サンプルは onDestroy でリソースを閉じています。これは、ユーザーがアクティビティを離れた後に発生する可能性があります (デバイスに十分なメモリがある場合でも)。でリソースを解放し、代わりにonPause再作成することを検討してください。onResume

最後に、私のコードでは、登録済みのコールバックを削除しています。{ spensBasicShapeConverter.setResultListener(null); を試してください。キャッチ (例外 e) { .. }

ヒープ ダンプを投資しているときに、アクティビティ (コールバック ハンドラー) が Spen API のデータ構造内に保持されているのを見ました。リスナーを削除すると、そのメモリ リークが削除されました。

于 2014-10-21T13:58:43.067 に答える