【问题标题】:Android - OutOfMemoryError reading 2D codes with cameraAndroid - OutOfMemoryError 用相机读取二维码
【发布时间】:2017-01-10 21:01:44
【问题描述】:

上下文:
我用 Xamarin.Android 开发了一个应用程序,它可以读取二维码 -datamatrix-(除其他外)。
为了读取二维码,我使用了第三方库 (NeoReader)
应用必须彻底读取数据矩阵(例如 400 次)。

行为如下:

  1. Activity A 通过调用 Activity B(带摄像头的那个)开始读取
  2. 活动 B 解码数据矩阵后,将值返回给活动 A
  3. Activity A 稍等片刻,从第 1 点开始)

    • 可以使用返回键中断循环

我在运行 Android 4.2 的三星 S4 mini 上测试了该应用,它运行良好(至少我没有收到 OutOfMemoryError)

然后我在运行 Android 5.1 的摩托罗拉 Moto G 中测试了该应用程序,在解码 75 和 80 之间的数据矩阵后,我得到了 OutOfMemoryError。

这是出现错误的行:
Java.Lang.OutOfMemoryError: Failed to allocate a 1843212 byte allocation with 1709964 free bytes and 1669KB until OOM

请找到附有完整日志的文件,以防某些慈善人士想为这个问题添加一些亮点:
OutOfMemory.txt

【问题讨论】:

  • 在 Android 设备监视器中使用 Allocation Tracker 来查看本机发生的情况可能会有所帮助。您还可以使用 Xamarin 分析器查看托管端发生的情况。这些项目将有助于查明分配和未发布的内容。 developer.android.com/studio/profile/investigate-ram.html
  • 奇怪的建议,但尝试在活动 A 再次启动流程之前调用 GC.Collect()。 Android 上的图片会吃内存,很容易导致 OOM 错误,但是做一个显式的 GC.Collect 可以在内存用完之前把内存清理干净。
  • @JimBobBennett 我已经这样做了,然后在解码大约 90 个数据矩阵时出现 OOM。由于我在 Xamarin 中工作并且我已经构建了一个绑定库以使用 java 库,因此我发现很难确定泄漏的位置。我想我会花适当的时间尝试使用监控工具解决问题。我已经尝试过使用 Xamarin Profiler(我第一次使用它),但这对我没有多大帮助。

标签: xamarin xamarin.android


【解决方案1】:

我将自己回答这个问题。
我在读取之间增加了更多时间(从 500 更改为 1500 毫秒),在每次新读取之前强制 GC,并移动了对相机活动中事件的一些引用。
就这样,问题似乎解决了。

附:我还使用示例应用程序在 Java 中重现了该问题,因此不仅仅是 Xamarin 问题。

【讨论】:

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