2013-02-21 82 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); 
相關問題