2013-02-21 66 views
5

में 32 बिट से अधिक है यह Mysterious stacktrace in Android developer console (bitmap size exceeds 32bits)एंड्रॉयड: बिटमैप आकार DialogFragment

यही सवाल का डुप्लिकेट कोड की एक पंक्ति प्रदान नहीं किया नहीं है और वहाँ कोई जवाब नहीं है या तो; इसके अलावा, मुझे यह त्रुटि मिलती है भले ही मैं बिटमैप आकार 32x32 पर सेट करता हूं, यह केवल बिटमैप है, इसलिए यह स्मृति से संबंधित नहीं है।

मैं

  1. कर एक imageView के आकार जाओ,
  2. एक बिटमैप
  3. बना सकते हैं और एक कैनवास पर कुछ बना करना चाहते हैं क्या।

बिटमैप imageView के आकार के लिए और इसलिए Log.e उत्पादन होता है:

Width: 272 
Height: 136 

क्या

नीचे कोड Nexus4, Nexus7 और Desire HD पर अच्छी तरह से काम होता है (CM10) , लेकिन एमुलेटर पर ऐप चलाने से मुझे नीचे दिखाए गए त्रुटि (एपीआई 8) मिलती है।

निष्कर्ष

  1. मैं आधे आकार और 32x32, जो एक ही त्रुटि देता है के साथ यह कोशिश की है।

  2. मैं छवि दृश्य को एक संवादप्रवाह में प्रदर्शित कर रहा हूं (एक्शनबारशेलॉक/एपीआई 8 के लिए होलोवेरीवेयर), शायद यह अपराधी है?

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

क्या आपको समाधान, या यहां तक ​​कि इस अपवाद का कारण भी मिला? –

+0

स्टैक ट्रेस से पता चलता है कि क्रैश 'waveBitmap' पर नहीं है, बल्कि एनीमेशन के कारण' buildDrawingCache() 'को कॉल करना प्रारंभ होता है। –

उत्तर

2

बिटमैप्स में आकार सीमा है जो डिवाइस पर निर्भर करती है। आकार आम तौर पर स्क्रीन का आकार होता है। स्टैक ओवरफ़्लो पर कई प्रश्न हैं जो इस समस्या को संबोधित करते हैं, जैसे OutOfMemoryError: bitmap size exceeds VM budget :- Android या Strange out of memory issue while loading an image to a Bitmap object। यदि आपको एक बहुत बड़ी छवि की आवश्यकता है, तो आप इसे अधिक प्रबंधनीय आकारों में आसानी से तोड़ सकते हैं, और उन्हें कई ImageViews में रख सकते हैं। मैंने कई महीनों पहले एक बड़ी, स्क्रोल करने योग्य छवि के साथ एक ऐप बनाया था जो लगभग 15 छवियों को एक साथ घिरा हुआ था - यह मान्य है कि यह जाने का एक अच्छा तरीका है।

अंतिम नोट पर, एंड्रॉइड पर होने वाली स्मृति समस्याओं के कारण बिटमैप्स को सीधे काम करना मुश्किल होता है। BitmapFactory.Options पर देखें, और हमेशा याद रखें और recycle अप्रयुक्त बिटमैप्स को याद रखें।

संपादित

यह भी onPreDraw() में देखें की सामग्री को संशोधित के साथ कुछ हो सकता है।यह पोस्ट: When Can I First Measure a View? चर्चा करता है कि इस विधि में किसी दृश्य के आकार को संपादित करने से onPreDraw() लगातार कॉल किया जा सकता है, जबकि onGlobalLayoutListener के साथ इन परिचालनों को निष्पादित करने से अपेक्षित परिणाम मिलेंगे।

+0

मुझे उन सभी के बारे में पता है, लेकिन आकार केवल 272x136 है (जैसा कि मेरी पोस्ट में उल्लिखित है), जो स्क्रीन चौड़ाई से कम है, क्योंकि यह ImageView एक संवादप्रवाह में दिखाया गया है। मुझे आउट ऑफ़ मेमोरी त्रुटि नहीं मिलती है, लेकिन प्रश्न में ऊपर वर्णित एक है। – stefple

+0

बिटमैप आकार के साथ 32x32 पर सेट की गई त्रुटि। यह एकमात्र बिटमैप है जो मैं दिखा रहा हूं, मेरे ऐप में स्मृति की एक बड़ी आवश्यकता के साथ कुछ भी नहीं। – stefple

+0

@stefple मेरा संपादन देखें – Phil

0

एपीआई 8 में मेल_पैरेंट (दोनों चौड़ाई और ऊंचाई) के लिए डायलॉगफ्रैगमेंट स्थापित करने में कोई समस्या प्रतीत होती है। मैं बिल्कुल नहीं कह सकता कि क्या हो रहा है, लेकिन निम्नलिखित डमी लेआउट को ठीक करना (मेरे पास एक जोड़ा था LinearLayouts/TextViews/SeekBars आदि layout_width = "match_parent" और पूरी बात एपीआई में काम के साथ 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);