我有一个屏幕,它将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”标签。
答案 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中的某些数据结构中。删除侦听器会删除内存泄漏。