2013-02-21 83 views
5

32位这不是Mysterious stacktrace in Android developer console (bitmap size exceeds 32bits)安卓:位图大小超过DialogFragment

这个问题重复没有提供一个单一的代码行,有没有答案要么;此外,即使将位图大小设置为32x32,我也会得到此错误,但它是唯一的位图,因此它与内存无关。

我想做

  1. 获取一个ImageView的大小,
  2. 创建位图
  3. 和借鉴的东西在Canvas什么。

Log.e输出为ImageView的大小,因此位图是:

Width: 272 
Height: 136 

会发生什么

下面的代码工作很好的Nexus4,Nexus7与Desire HD(CM10) ,但在模拟器上运行应用程序会给我下面显示的错误(API 8)。

发现

  1. 我一半的大小和32×32,这给了同样的错误尝试。

  2. 我在DialogFragment(ActionBarSherlock/HoloEveryWhere for API 8)中显示ImageView,也许这是罪魁祸首?

的ImageView:

<ImageView 
     android:id="@+id/imageView1" 
     android:layout_width="match_parent" 
     android:layout_height="1dp" 
     android:layout_marginBottom="12dp" 
     android:layout_marginTop="12dp" /> 

在我的活动:

iv = (ImageView) view.findViewById(R.id.imageView1); 
ViewTreeObserver vto = iv.getViewTreeObserver(); 
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
    @Override 
    public boolean onPreDraw() { 
     if (!waveFormMeasured) { 
      if (iv.getMeasuredWidth() > 1) { 
       width = iv.getMeasuredWidth(); 
       Log.e(TAG, "Width: " + width + " Height: " + width/2); 
       waveBitmap = Bitmap.createBitmap((int) width, (int) ((int) width/2), Config.RGB_565); 
       Log.e(TAG, "Bitmap created"); 
       waveCanvas = new Canvas(waveBitmap); 
       Log.e(TAG, "Bitmap set to Canvas"); 
       iv.getLayoutParams().height = width/2; 
       Log.e(TAG, "ImageView Height changed"); 
       iv.setImageBitmap(waveBitmap); 
       Log.e(TAG, "Bitmap set to ImageView"); 
       drawWaveForm(true); 
       Log.e(TAG, "WaveForm drawn"); 
       waveFormMeasured = true; 
       } 
      } 
    return true; 
    } 
    }); 

这里有什么问题?

02-21 17:12:48.301: E/Drummers(375): Width: 272 Height: 136 
02-21 17:12:48.301: E/Drummers(375): Bitmap created 
02-21 17:12:48.301: E/Drummers(375): Bitmap set to Canvas 
02-21 17:12:48.301: E/Drummers(375): ImageView Height changed 
02-21 17:12:48.301: E/Drummers(375): Bitmap set to ImageView 
02-21 17:12:48.623: E/Drummers(375): WaveForm drawn 
02-21 17:12:48.842: E/AndroidRuntime(375): FATAL EXCEPTION: main 
02-21 17:12:48.842: E/AndroidRuntime(375): java.lang.IllegalArgumentException: bitmap size exceeds 32bits 
02-21 17:12:48.842: E/AndroidRuntime(375): at android.graphics.Bitmap.nativeCreate(Native Method) 
02-21 17:12:48.842: E/AndroidRuntime(375): at android.graphics.Bitmap.createBitmap(Bitmap.java:477) 
02-21 17:12:48.842: E/AndroidRuntime(375): at android.view.View.buildDrawingCache(View.java:6577) 
02-21 17:12:48.842: E/AndroidRuntime(375): at android.view.ViewGroup.onAnimationStart(ViewGroup.java:1259) 
02-21 17:12:48.842: E/AndroidRuntime(375): at android.view.ViewGroup.drawChild(ViewGroup.java:1505) 
02-21 17:12:48.842: E/AndroidRuntime(375): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 
02-21 17:12:48.842: E/AndroidRuntime(375): at android.view.View.draw(View.java:6883) 
02-21 17:12:48.842: E/AndroidRuntime(375): at android.view.ViewGroup.drawChild(ViewGroup.java:1646) 
02-21 17:12:48.842: E/AndroidRuntime(375): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 
02-21 17:12:48.842: E/AndroidRuntime(375): at android.view.View.draw(View.java:6986) 
02-21 17:12:48.842: E/AndroidRuntime(375): at android.widget.FrameLayout.draw(FrameLayout.java:357) 
02-21 17:12:48.842: E/AndroidRuntime(375): at android.widget.ScrollView.draw(ScrollView.java:1409) 
02-21 17:12:48.842: E/AndroidRuntime(375): at android.view.ViewGroup.drawChild(ViewGroup.java:1646) 
02-21 17:12:48.842: E/AndroidRuntime(375): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 
02-21 17:12:48.842: E/AndroidRuntime(375): at android.view.ViewGroup.drawChild(ViewGroup.java:1644) 
02-21 17:12:48.842: E/AndroidRuntime(375): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 
02-21 17:12:48.842: E/AndroidRuntime(375): at android.view.ViewGroup.drawChild(ViewGroup.java:1644) 
02-21 17:12:48.842: E/AndroidRuntime(375): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 
02-21 17:12:48.842: E/AndroidRuntime(375): at android.view.View.buildDrawingCache(View.java:6640) 
02-21 17:12:48.842: E/AndroidRuntime(375): at android.view.ViewGroup.onAnimationStart(ViewGroup.java:1259) 
02-21 17:12:48.842: E/AndroidRuntime(375): at android.view.ViewGroup.drawChild(ViewGroup.java:1505) 
02-21 17:12:48.842: E/AndroidRuntime(375): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 
02-21 17:12:48.842: E/AndroidRuntime(375): at android.view.View.draw(View.java:6883) 
02-21 17:12:48.842: E/AndroidRuntime(375): at android.widget.FrameLayout.draw(FrameLayout.java:357) 
02-21 17:12:48.842: E/AndroidRuntime(375): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1862) 
02-21 17:12:48.842: E/AndroidRuntime(375): at android.view.ViewRoot.draw(ViewRoot.java:1522) 
02-21 17:12:48.842: E/AndroidRuntime(375): at android.view.ViewRoot.performTraversals(ViewRoot.java:1258) 
02-21 17:12:48.842: E/AndroidRuntime(375): at android.view.ViewRoot.handleMessage(ViewRoot.java:1859) 
02-21 17:12:48.842: E/AndroidRuntime(375): at android.os.Handler.dispatchMessage(Handler.java:99) 
02-21 17:12:48.842: E/AndroidRuntime(375): at android.os.Looper.loop(Looper.java:123) 
02-21 17:12:48.842: E/AndroidRuntime(375): at android.app.ActivityThread.main(ActivityThread.java:3683) 
02-21 17:12:48.842: E/AndroidRuntime(375): at java.lang.reflect.Method.invokeNative(Native Method) 
02-21 17:12:48.842: E/AndroidRuntime(375): at java.lang.reflect.Method.invoke(Method.java:507) 
02-21 17:12:48.842: E/AndroidRuntime(375): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
02-21 17:12:48.842: E/AndroidRuntime(375): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
02-21 17:12:48.842: E/AndroidRuntime(375): at dalvik.system.NativeStart.main(Native Method) 
+0

您是否找到解决方案,甚至是此异常的原因? – 2015-04-08 09:39:21

+0

堆栈跟踪表明崩溃不在'waveBitmap'上,而是由动画开始调用'buildDrawingCache()'造成的。 – 2015-07-15 15:35:59

回答

2

位图的大小限制取决于设备。大小通常是屏幕本身的大小。解决此问题的堆栈溢出有几个问题,例如OutOfMemoryError: bitmap size exceeds VM budget :- AndroidStrange out of memory issue while loading an image to a Bitmap object。如果你需要一个非常大的图像,你可以简单地将它分解成更易于管理的尺寸,并将它们放置在多个ImageViews中。几个月前,我创建了一个应用程序,其中包含大量可滚动图像,大约15张图像无缝地串在一起 - 验证了这是一个很好的方法。

最后一点,由于它们在Android上引起的内存问题,位图难以直接使用。看看BitmapFactory.Options,并始终记住取消和recycle未使用的位图。

编辑

它也可能是与修改onPreDraw()查看的内容。这篇文章:When Can I First Measure a View?讨论了如何编辑此方法中View的大小将导致不断调用onPreDraw(),而使用onGlobalLayoutListener执行这些操作将提供预期结果。

+0

我知道所有这些,但尺寸仅为272x136(如我的文章中所述),它小于屏幕宽度,因为这是ImageView显示在DialogFragment中。我没有得到一个内存不足的错误,但在问题中提到的那个。 – stefple 2013-02-21 17:38:57

+0

与位图大小设置为32x32相同的错误。这是我显示的唯一Bitmap,没有其他内容在我的应用中需要大量内存。 – stefple 2013-02-22 08:10:57

+0

@stefple查看我的编辑 – Phil 2013-02-22 14:38:38

0

在API 8中将DialogFragment设置为match_parent(包括宽度和高度)似乎存在问题。 我不能准确地说出发生了什么,但添加了以下虚拟布局修复了它(我有一对的LinearLayouts/TextViews/SeekBars等与layout_width = “match_parent” 和API工作整件事11+):

<org.holoeverywhere.widget.ListView 
    android:id="@+id/sampleList" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" > 
</org.holoeverywhere.widget.ListView> 

以下没有工作,将其设置为全屏:

setStyle(...) 

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); 
相关问题