1

我有一个用 Android 布局组件覆盖 SpenSurfaceView 的屏幕。当用户切换屏幕加载不同的组件时,旧的组件会泄漏到这个类中:

com.samsung.android.sdk.pen.engine.SpenInView 根据 MA​​T (Memory Analyzer T) 来自本机堆栈

覆盖的组件是自定义控制器,以笔划的形式接收用户输入。它们具有对 SurfaceView 的引用,但在删除组件之前它为空。

即使我完全退出应用程序,问题仍然存在。

我使用示例 PenSample5_6_TextRecognition 作为参考。

这是使用三星移动 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

最后,在我的代码中,我正在删除注册的回调 private void removeListeners() { spenPageDocContainingNoteDoc.setObjectListener(null); 尝试 {spensBasicShapeConverter.setResultListener(null); } 捕捉(异常 e){ .. }

在投资堆转储时,我看到我的 Activity(回调处理程序)保存在 Spen API 的一些数据结构中。删除侦听器消除了内存泄漏。

于 2014-10-21T13:58:43.067 回答