巨大的位图在Android中导致ANR

时间:2012-03-22 21:49:03

标签: android bitmap android-ndk java-native-interface

事情就是这样:

  • 我正在使用巨大的位图[1024 X 1024]
  • 我需要(RGB& alpha)格式的BitMap数据用于像素操作;对于这种操作,我使用的是本机库
  • 活动适用于[512 X 512]图像...但是当我在具有类似任务的活动之间切换时,机器人崩溃并跟踪以下内容

问题是:

  • 我做错了什么?什么应该导致JiT调整大小?
  • 有没有办法加载巨大的位图..?如果我使用应用程序缓存;它会在这种情况下为我提供一些好处吗?如果是,那么哪个内存会缓存消耗?主要是我达到内存限制......所以我试图解决这个问题......

追踪:

03-22 14:21:05.240: I/dalvikvm(105): Jit: resizing JitTable from 8192 to 16384
03-22 14:21:05.730: D/dalvikvm(196): GC_EXPLICIT freed 44K, 50% free 3130K/6151K,external 5368K/6703K, paused 713ms

请注意:

  • 我目前正在运行API 10 [没有使用API​​ 11或更多的范围]
  • 我也无法使用“android:largeHeap”选项
  • 当我使用本机库时,我正在达到6 MB限制[本机内存],尽管我有32 MB内存供我使用...

更新: [ANR追踪]

此ANR跟踪指示KeyDispatchingTimedOut ..但我认为这不是原因......当点击“菜单”时我正在使用Intent切换到另一个活动..当此活动启动时,它需要计算“背景图片“基于”颜色数组“使用本机库...这需要很长时间...... 请注意,当单独启动活动时,会发生相同的计算...

E/ActivityManager(105): ANR in com.uc (com.uc/.UcMain)
E/ActivityManager(105): Reason: keyDispatchingTimedOut
E/ActivityManager(105): Load: 2.31 / 1.58 / 1.48
E/ActivityManager(105): CPU usage from 29434ms to 1ms ago:
E/ActivityManager(105):   97% 1737/com.uc: 97% user + 0.1% kernel / faults: 117 minor
E/ActivityManager(105):   1.4% 73/akmd: 0% user + 1.4% kernel
E/ActivityManager(105):   0.6% 105/system_server: 0.2% user + 0.3% kernel / faults: 9 minor

1 个答案:

答案 0 :(得分:3)

ANR实际上不是一个内存问题,在UI线程(调试器中的'main')上做一些事情需要花费太长时间。您在UI线程上执行的任何工作都需要快速或将触发ANR监视器。您正在执行的长时间运行过程会导致将此需要放入另一个线程中。

您需要将正在进行的工作移动到单独的线程中来计算背景图像。我建议您使用只使用进度微调器加载Activity的方法并启动后台线程,然后您可以实际显示UI隐藏微调器并显示您想要设置背景图像的视图。

请注意,您只能从UI线程更改Views,例如调用API View.setBackgroundDrawable(...),但您可以在后台线程中构造Drawable,然后从UI线程设置它。 AsyncTask适用于这种工作模式。 如果您不使用AsyncTask,那么您将使用API​​ Activity.runOnUiThread(...)