【问题标题】:Memory leak at SpenInView Native StackSpenInView Native Stack 的内存泄漏
【发布时间】:2014-02-23 21:20:02
【问题描述】:

我有一个用 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”标签吗?

【问题讨论】:

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


    【解决方案1】:

    请查看示例应用程序中的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 中重新创建它们。

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

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

    【讨论】:

      猜你喜欢
      • 2016-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多