SpenInView Native Stack中的内存泄漏

时间:2014-02-23 21:20:03

标签: android memory-leaks samsung-mobile samsung-mobile-sdk

我有一个屏幕,它将SpenSurfaceView与Android布局组件叠加在一起。当用户切换屏幕以加载不同的组件时,旧组件会泄漏到此类中:

com.samsung.android.sdk.pen.engine.SpenInView 根据MAT(Memory Analyzer T)从本机堆栈中

重叠组件是自定义控制器,以笔画的形式接收用户输入。它们引用了SurfaceView,但在删除组件之前它是无效的。

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

我使用示例PenSample5_6_TextRecognition作为参考。

这是使用Samsung Mobile SDK(http://developer.samsung.com/samsung-mobile-sdk

我应该采用什么策略来继续追逐内存泄漏? SDK的NDK端可能是封闭源。

SpenObjectBase是否保留对SpenSurfaceView的引用?

声名远远超过我的人可以创建“spen sdk”标签。

1 个答案:

答案 0 :(得分: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);         } catch(例外e){             ..         }

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