java.lang.OutOfMemoryError: बिटमैप का आकार VM बजट से अधिक है - Android


159

मैंने एक एप्लिकेशन विकसित किया है जो एंड्रॉइड पर बहुत सारी छवियों का उपयोग करता है।

अनुप्रयोग, एक बार चलाता स्क्रीन (के बारे में जानकारी भरता है Layouts, Listviews, Textviews, ImageViews, आदि) और उपयोगकर्ता जानकारी पढ़ता है।

कोई एनीमेशन, कोई विशेष प्रभाव या कुछ भी नहीं है जो स्मृति को भर सकता है। कभी-कभी ड्रॉइंग बदल सकते हैं। कुछ Android संसाधन हैं और कुछ एसडीकार्ड में एक फ़ोल्डर में सहेजी गई फाइलें हैं।

तब उपयोगकर्ता क्विट करता है ( onDestroyविधि निष्पादित होती है और ऐप वीएम द्वारा मेमोरी में रहता है) और फिर कुछ बिंदु पर उपयोगकर्ता फिर से प्रवेश करता है।

हर बार जब उपयोगकर्ता ऐप में प्रवेश करता है, तो मैं मेमोरी को अधिक से अधिक तब तक देख सकता हूं जब तक उपयोगकर्ता को नहीं मिलता java.lang.OutOfMemoryError

तो कई छवियों को संभालने का सबसे अच्छा / सही तरीका क्या है?

क्या मुझे उन्हें स्थिर तरीकों से रखना चाहिए ताकि वे हर समय लोड न हों? क्या मुझे लेआउट या लेआउट में उपयोग की गई छवियों को एक विशेष तरीके से साफ करना है?


4
यदि आपके पास बहुत सारी ड्रॉइंग हैं, तो यह आपकी मदद कर सकता है। यह काम कर रहा है क्योंकि मैंने खुद कार्यक्रम किया :) androidactivity.wordpress.com/2011/09/24/…

जवाबों:


72

ऐसा लगता है कि आपके पास स्मृति रिसाव है। समस्या कई छवियों को संभाल नहीं रही है, यह है कि जब आपकी गतिविधि नष्ट हो जाती है तो आपकी छवियां डील-डौल नहीं हो रही हैं।

यह कहना मुश्किल है कि यह आपके कोड को देखे बिना क्यों है। हालाँकि, इस लेख में कुछ सुझाव हैं जो मदद कर सकते हैं:

http://android-developers.blogspot.de/2009/01/avoiding-memory-leaks.html

विशेष रूप से, स्थैतिक चर का उपयोग करने से चीजें खराब होने की संभावना है, बेहतर नहीं। आपको कोड जोड़ने की आवश्यकता हो सकती है जब आपके आवेदन के फिर से आने पर कॉलबैक निकालता है - लेकिन फिर, सुनिश्चित करने के लिए कहने के लिए यहां पर्याप्त जानकारी नहीं है।


8
यह सही है और इसमें बहुत सारी छवियां हैं (और मेमोरी लीक नहीं है) कई कारणों से आउटऑफमेरी का कारण बन सकती है जैसे बहुत सारे अन्य ऐप चल रहे हैं, मेमोरी का विखंडन आदि, मैंने सीखा है कि जब आप बहुत सारी छवियों के साथ काम कर रहे हैं, तो आपको आउटमैमरी मिलती है। व्यवस्थित रूप से, हमेशा एक जैसा करना, फिर उसका रिसाव। यदि आपको दिन में एक बार या कुछ ऐसा मिलता है, तो इसका कारण यह है कि आप सीमा के बहुत करीब हैं। इस मामले में मेरा सुझाव कुछ सामान हटाने और फिर से कोशिश करने का है। इसके अलावा छवि मेमोरी हीप मेमोरी के बाहर है, इसलिए दोनों को देखें।
डैनियल बेनिदकट

15
यदि आपको मेमोरी लीकेज पर संदेह है, तो ढेर के उपयोग की निगरानी करने का एक त्वरित तरीका अदब शेल डंप्स मेमिनफो कमांड है। यदि आप कुछ gc साइकिलों (GC_ * log row in logcat) पर ढेर का उपयोग बढ़ाते हुए देखते हैं, तो आपको यकीन है कि आपके पास एक रिसाव हो सकता है। फिर adb या DDMS के माध्यम से एक अलग डंप (या कई बार अलग-अलग) बनाएं और ग्रहण MAT पर टूलिंग ट्री टूलिंग के माध्यम से इसका विश्लेषण करें। आपको बहुत जल्द यह पता लगाना चाहिए कि किस ऑब्जेक्ट में एक हीप्स है जो समय के साथ बढ़ता है। वह आपकी मेमोरी लीक है। मैंने यहाँ कुछ और विवरणों के साथ एक लेख लिखा: macgyverdev.blogspot.com/2011/11/…
जोहान नॉरेन

98

सबसे आम त्रुटियों में से एक जो मुझे एंड्रॉइड ऐप विकसित करते हुए मिली, वह है "java.lang.OutOfMemoryError: बिटमैप का आकार VM बजट से अधिक" त्रुटि। अभिविन्यास बदलने के बाद बहुत सारे बिटमैप्स का उपयोग करने वाली गतिविधियों पर मुझे अक्सर यह त्रुटि मिली: गतिविधि को नष्ट कर दिया गया है, फिर से बनाया गया है और एक्सएमएल से बिटमैप्स के लिए उपलब्ध वीएम मेमोरी का उपभोग करते हुए लेआउट को "फुलाया" गया है।

पिछली गतिविधि लेआउट पर बिटमैप को कचरा कलेक्टर द्वारा ठीक से आवंटित नहीं किया गया है क्योंकि उन्होंने अपनी गतिविधि के संदर्भों को पार कर लिया है। कई प्रयोगों के बाद मुझे इस समस्या का काफी अच्छा समाधान मिला।

सबसे पहले, अपने XML लेआउट के मूल दृश्य पर "आईडी" विशेषता सेट करें:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:id="@+id/RootView"
     >
     ...

फिर, onDestroy() अपनी गतिविधि के unbindDrawables()तरीके पर, पेरेंट व्यू के संदर्भ को पास करने वाली विधि को कॉल करें और फिर एक करें System.gc()

    @Override
    protected void onDestroy() {
    super.onDestroy();

    unbindDrawables(findViewById(R.id.RootView));
    System.gc();
    }

    private void unbindDrawables(View view) {
        if (view.getBackground() != null) {
        view.getBackground().setCallback(null);
        }
        if (view instanceof ViewGroup) {
            for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
            unbindDrawables(((ViewGroup) view).getChildAt(i));
            }
        ((ViewGroup) view).removeAllViews();
        }
    }

यह unbindDrawables()विधि दृश्य के पेड़ की पुनरावृत्ति करती है और:

  1. सभी बैकग्राउंड ड्रॉबल्स पर कॉलबैक को हटाता है
  2. हर व्यूग्रुप पर बच्चों को हटाता है

10
को छोड़कर ... java.lang.UnsupportedOperationException: removeAllViews () AdapterView में समर्थित नहीं है

धन्यवाद, यह मेरे ढेर के आकार को कम करने में मदद करता है क्योंकि मेरे पास बहुत सारे ड्रॉबल्स हैं ... @GJTorikian इसके लिए सिर्फ removeAllViews पर पकड़ने की कोशिश करें () अधिकांश व्यूग्रुप उपक्लासेस ठीक काम करते हैं।
एरिक चेन

5
(AdapterView instanceof दृश्य ViewGroup instanceof && दृश्य ()!) यदि: या सिर्फ हालत बदल
एंके

2
@ अदम वराहिगी, आप स्पष्ट रूप से onDestroy में गैलरी दृश्य के लिए एक ही फ़ंक्शन को कॉल कर सकते हैं। अनबिन्ड्रावेबल्स (गैलरी व्यू) की तरह; आशा है कि यह आपके लिए काम करता है ...
hp.android

1
इन दोनों पकड़ लिया के लिए बाहर देखने के stackoverflow.com/questions/8405475/... और stackoverflow.com/questions/4486034/...
max4ever

11

इस समस्या से बचने के लिए आप देशी पद्धति का उपयोग कर सकते हैं Bitmap.recycle()इससे पहले कि nullआईएनजी Bitmapवस्तु (या किसी अन्य मान सेट)। उदाहरण:

public final void setMyBitmap(Bitmap bitmap) {
  if (this.myBitmap != null) {
    this.myBitmap.recycle();
  }
  this.myBitmap = bitmap;
}

और आगे आप बदल सकते हैं myBitmap w / o कॉलिंगSystem.gc() जैसे:

setMyBitmap(null);    
setMyBitmap(anotherBitmap);

1
यह काम नहीं करेगा यदि उन तत्वों को सूची में जोड़ने की कोशिश की जा रही है। क्या आपके पास उस पर कोई सुझाव है?
राफेल बेंच

@ddmytrenko आप इसे असाइन करने से पहले छवि को पुन: चक्रित कर रहे हैं। क्या वह अपने पिक्सेल को रेंडर करने से नहीं रोकेगा?
इगोरगानापोलस्की

8

मैं इस सटीक समस्या में भाग गया हूं। ढेर बहुत छोटा है, इसलिए ये चित्र स्मृति के संबंध में नियंत्रण से बाहर निकल सकते हैं। एक तरीका यह है कि कचरा संग्रहकर्ता को कॉल करके बिटमैप पर मेमोरी एकत्र करने का संकेत दिया जाए अपने रीसायकल विधि

इसके अलावा, onDestroy विधि को कॉल करने की गारंटी नहीं है। आप इस तर्क को आगे बढ़ाना चाहते हैं / ऑनपोज़ गतिविधि में सफाई कर सकते हैं। अधिक जानकारी के लिए इस पृष्ठ पर गतिविधि जीवनचक्र आरेख / तालिका देखें ।


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

onPauseसुझाव के लिए धन्यवाद । मैं Bitmapउन सभी में छवियों के साथ 4 टैब का उपयोग कर रहा हूं , इसलिए गतिविधि को नष्ट करना बहुत जल्द नहीं हो सकता है (यदि उपयोगकर्ता सभी टैब को ब्राउज़ करता है)।
अज़र्सपॉट

7

यह स्पष्टीकरण मदद कर सकता है: http://code.google.com/p/android/issues/detail?id=8488#c80

"फास्ट टिप्स:

1) कभी भी System.gc () को कॉल करें। इसे यहां फिक्स के रूप में प्रचारित किया गया है, और यह काम नहीं करता है। ऐसा मत करो। यदि आपने मेरे स्पष्टीकरण पर ध्यान दिया, तो आउटऑफ़मैरीऑर्रोर प्राप्त करने से पहले, जेवीएम पहले से ही एक कचरा संग्रह चलाता है, इसलिए फिर से एक करने का कोई कारण नहीं है (इसके कारण आपका कार्यक्रम धीमा हो जाता है)। अपनी गतिविधि के अंत में एक करना समस्या को कवर कर रहा है। यह बिटमैप को अंतिम रूप से कतार में तेजी से डालने का कारण हो सकता है, लेकिन ऐसा कोई कारण नहीं है कि आप इसके बजाय प्रत्येक बिटमैप पर रीसायकल नहीं कह सकते।

2) बिटकैप पर हमेशा रीसायकल () कॉल करें जिसकी आपको अब आवश्यकता नहीं है। बहुत कम से कम, अपनी गतिविधि के onDestroy के माध्यम से जाना और आपके द्वारा उपयोग किए जा रहे सभी बिटमैप को रीसायकल करते हैं। इसके अलावा, यदि आप चाहते हैं कि बिटमैप उदाहरणों को तेजी से डाल्विक ढेर से एकत्र किया जाए, तो यह बिटमैप के किसी भी संदर्भ को स्पष्ट करने के लिए चोट नहीं पहुंचाता है।

3) कॉलिंग रीसायकल () और उसके बाद System.gc () अभी भी दलविक ढेर से बिटमैप को नहीं हटा सकता है। इस बारे में सहमत नहीं होना चाहिए। रीसायकल () ने अपना काम किया और देशी मेमोरी को मुक्त कर दिया, मुझे पहले चरण में बताए गए चरणों से गुजरने में कुछ समय लगेगा, वास्तव में डाल्विक ढेर से बिटमैप को हटाने के लिए। यह कोई बड़ी बात नहीं है क्योंकि देशी मेमोरी का बड़ा हिस्सा पहले से ही मुफ्त है!

4) हमेशा मान लें कि पिछले ढांचे में एक बग है। डाल्विक ठीक वही कर रहा है जो उसका करना चाहिए था। यह वह नहीं हो सकता है जो आप उम्मीद करते हैं या आप क्या चाहते हैं, लेकिन यह कैसे काम करता है। "


5

मेरे साथ भी ठीक यही समस्या थी। कुछ परीक्षण के बाद मैंने पाया कि यह त्रुटि बड़ी छवि स्केलिंग के लिए दिखाई दे रही है। मैंने इमेज स्केलिंग को कम कर दिया और समस्या गायब हो गई।

पुनश्च पहली बार में मैंने छवि के आकार को कम करने की कोशिश की, ताकि छवि नीचे न आए। यह त्रुटि को रोक नहीं पाया।


4
क्या आप कोड को पोस्ट कर सकते हैं कि आपने छवि स्केलिंग कैसे की है, मैं उसी समस्या का सामना कर रहा हूं और मुझे लगता है कि यह इसे हल कर सकता है। धन्यवाद!
27'11

@ जीक्स - मेरा मानना ​​है कि उनका मतलब है कि उन्हें प्रोजेक्ट संसाधनों में लाने से पहले छवियों के आकार को कम करना था, इस प्रकार ड्रॉइंग के मेमोरी फुटप्रिंट को कम करना था। इसके लिए आपको अपनी पसंद के फोटो एडिटर का इस्तेमाल करना चाहिए। मुझे pixlr.com पसंद है
काइल क्लेग

5

निम्नलिखित बिंदुओं ने वास्तव में मुझे बहुत मदद की। अन्य बिंदु भी हो सकते हैं, लेकिन ये बहुत महत्वपूर्ण हैं:

  1. जहां संभव हो, एप्लिकेशन संदर्भ (गतिविधि के बजाय) का उपयोग करें।
  2. बंद करो और अपने धागे onPause () गतिविधि की विधि को जारी करें
  3. गतिविधि के तरीके पर onDestroy () पद्धति में अपने विचार / कॉलबैक जारी करें

4

मैं इस समस्या को हल करने के लिए एक सुविधाजनक तरीका सुझाता हूं। बस अपनी त्रुटिपूर्ण गतिविधि के लिए Mainfest.xml में निम्नलिखित विशेषता "android: configChanges" मान निर्दिष्ट करें। इस तरह:

<activity android:name=".main.MainActivity"
              android:label="mainActivity"
              android:configChanges="orientation|keyboardHidden|navigation">
</activity>

पहला समाधान जो मैंने दिया था, वह वास्तव में OOM त्रुटि की आवृत्ति को निम्न स्तर तक कम कर दिया था। लेकिन, इसने पूरी तरह से समस्या का समाधान नहीं किया। और फिर मैं दूसरा समाधान दूंगा:

जैसा कि OOM विस्तृत है, मैंने बहुत अधिक रनटाइम मेमोरी का उपयोग किया है। इसलिए, मैं अपने प्रोजेक्ट के ~ / Res / drawable में चित्र का आकार कम करता हूं। जैसे कि एक अयोग्य तस्वीर जिसमें 128X128 का रिज़ॉल्यूशन है, को 64x64 में बदला जा सकता है जो मेरे आवेदन के लिए भी उपयुक्त होगा। और जब मैंने चित्रों के ढेर के साथ ऐसा किया, तो OOM त्रुटि फिर से नहीं होती है।


1
यह काम करता है क्योंकि आप अपने ऐप को पुनरारंभ करने से बच रहे हैं। तो यह इतना समाधान नहीं है क्योंकि यह एक बचाव है। लेकिन कभी-कभी यह सब आपको चाहिए होता है। और गतिविधि में डिफ़ॉल्ट onConfigurationChanged () विधि आपके लिए आपके अभिविन्यास को फ्लिप करेगी, इसलिए यदि आपको अलग-अलग अभिविन्यासों के अनुकूल होने के लिए किसी भी UI परिवर्तनों की आवश्यकता नहीं है, तो आप परिणाम से पूरी तरह से खुश हो सकते हैं। अन्य चीजों के लिए देखें जो आपको फिर से शुरू कर सकती हैं। आप इसका उपयोग करना चाह सकते हैं: Android: configChanges = "कीबोर्डहेड्ड; ओरिएंटेशन | कीबोर्ड | लोकेल | mcc। Mnc | टचस्क्रीन | screenLayout | fontScale"
कार्ल

3

मैं भी आउटफॉमेरी बग से निराश हूं। और हां, मैंने यह भी पाया कि छवियों को स्केल करते समय यह त्रुटि बहुत अधिक होती है। सबसे पहले मैंने सभी घनत्वों के लिए छवि आकार बनाने की कोशिश की, लेकिन मैंने पाया कि मेरे ऐप के आकार में काफी वृद्धि हुई है। इसलिए मैं अब सभी घनत्वों के लिए केवल एक छवि का उपयोग कर रहा हूं और अपनी छवियों को स्केल कर रहा हूं।

जब भी उपयोगकर्ता एक गतिविधि से दूसरी गतिविधि में जाता है, तो मेरा आवेदन एक त्रुटिपूर्ण त्रुटि को फेंक देगा। मेरे ड्रॉबल्स को नल और कॉल करने के लिए सेट करें। System (gc) ने काम नहीं किया, न ही मेरे बिटमैप को पुन: प्राप्त करने के लिए getBitMap () के साथ रीसायकल () किया। एंड्रॉइड पहले दृष्टिकोण के साथ आउटफॉरमरी त्रुटि को फेंकना जारी रखेगा, और जब भी यह दूसरे दृष्टिकोण के साथ पुनर्नवीनीकरण बिटमैप का उपयोग करने की कोशिश करता है तो यह एक कैनवास त्रुटि संदेश फेंक देगा।

मैंने तीसरा तरीका भी अपनाया। मैं सभी दृश्यों को अशक्त करने के लिए और पृष्ठभूमि को काले रंग में सेट करता हूं। मैं अपने onStop () पद्धति में यह सफाई करता हूं। यह वह विधि है जिसे गतिविधि के रूप में जल्द ही कहा जाता है जो अब दिखाई नहीं देती है। यदि आप इसे ऑनपॉज () विधि में करते हैं, तो उपयोगकर्ताओं को एक काली पृष्ठभूमि दिखाई देगी। आदर्श नहीं। OnDestroy () पद्धति में इसे करने के लिए, इस बात की कोई गारंटी नहीं है कि इसे कहा जाएगा।

काली स्क्रीन को होने से रोकने के लिए यदि उपयोगकर्ता डिवाइस पर बैक बटन दबाता है, तो मैं स्टार्टरक्टिविटी (getIntent ()) और फिर फिनिश () विधियों को कॉल करके onRestart () विधि में गतिविधि को पुनः लोड करता हूं।

नोट: पृष्ठभूमि को काले रंग में बदलना वास्तव में आवश्यक नहीं है।


1

BitmapFactory.decode *, लोड बड़े बिटमैप्स कुशलतापूर्वक पाठ में चर्चा की गई विधियों को मुख्य UI थ्रेड पर निष्पादित नहीं किया जाना चाहिए यदि स्रोत डेटा डिस्क या नेटवर्क स्थान से पढ़ा जाता है (या वास्तव में स्मृति के अलावा कोई स्रोत है)। इस डेटा को लोड करने में लगने वाला समय अप्रत्याशित है और कई कारकों पर निर्भर करता है (डिस्क या नेटवर्क से पढ़ने की गति, छवि का आकार, सीपीयू की शक्ति, आदि)। यदि इनमें से कोई एक कार्य UI थ्रेड को ब्लॉक करता है, तो सिस्टम आपके एप्लिकेशन को गैर-उत्तरदायी के रूप में चिह्नित करता है और उपयोगकर्ता के पास इसे बंद करने का विकल्प होता है (अधिक जानकारी के लिए जवाबदेही के लिए डिज़ाइनिंग देखें)।


0

अच्छी तरह से मैंने इंटरनेट पर मिलने वाली हर चीज़ की कोशिश की और उनमें से कोई भी काम नहीं किया। System.gc () कॉलिंग केवल ऐप की गति को धीमा कर देती है। OnDestroy में पुनर्चक्रण बिटमैप्स ने मेरे लिए भी काम नहीं किया।

केवल एक चीज जो अब काम करती है वह है कि सभी बिटमैप की एक स्थिर सूची हो ताकि बिटमैप एक पुनरारंभ होने के बाद बच जाए। और फिर से शुरू होने पर हर बार नई गतिविधि बनाने के बजाय सहेजे गए बिटमैप का उपयोग करें।

मेरे मामले में कोड इस तरह दिखता है:

private static BitmapDrawable currentBGDrawable;

if (new File(uriString).exists()) {
    if (!uriString.equals(currentBGUri)) {
        freeBackground();
        bg = BitmapFactory.decodeFile(uriString);

        currentBGUri = uriString;
        bgDrawable = new BitmapDrawable(bg);
        currentBGDrawable = bgDrawable;
    } else {
        bgDrawable = currentBGDrawable;
    }
}

क्या यह आपके संदर्भ को लीक नहीं करेगा? (एक्टिविटी डेटा)
राफेल सेंक्शंस

0

मुझे उचित आकार के साथ पृष्ठभूमि छवियों को बदलने के साथ ही एक ही समस्या थी। एक नई तस्वीर में डालने से पहले ImageView को अशक्त करने के लिए मुझे बेहतर परिणाम मिले।

ImageView ivBg = (ImageView) findViewById(R.id.main_backgroundImage);
ivBg.setImageDrawable(null);
ivBg.setImageDrawable(getResources().getDrawable(R.drawable.new_picture));

0

एफडब्ल्यूआईडब्ल्यू, यहां एक हल्का बिटमैप-कैश है जिसे मैंने कोडित किया है और कुछ महीनों के लिए उपयोग किया है। यह सभी घंटियाँ और सीटी नहीं हैं, इसलिए उपयोग करने से पहले कोड को पढ़ें।

/**
 * Lightweight cache for Bitmap objects. 
 * 
 * There is no thread-safety built into this class. 
 * 
 * Note: you may wish to create bitmaps using the application-context, rather than the activity-context. 
 * I believe the activity-context has a reference to the Activity object. 
 * So for as long as the bitmap exists, it will have an indirect link to the activity, 
 * and prevent the garbaage collector from disposing the activity object, leading to memory leaks. 
 */
public class BitmapCache { 

    private Hashtable<String,ArrayList<Bitmap>> hashtable = new Hashtable<String, ArrayList<Bitmap>>();  

    private StringBuilder sb = new StringBuilder(); 

    public BitmapCache() { 
    } 

    /**
     * A Bitmap with the given width and height will be returned. 
     * It is removed from the cache. 
     * 
     * An attempt is made to return the correct config, but for unusual configs (as at 30may13) this might not happen.  
     * 
     * Note that thread-safety is the caller's responsibility. 
     */
    public Bitmap get(int width, int height, Bitmap.Config config) { 
        String key = getKey(width, height, config); 
        ArrayList<Bitmap> list = getList(key); 
        int listSize = list.size();
        if (listSize>0) { 
            return list.remove(listSize-1); 
        } else { 
            try { 
                return Bitmap.createBitmap(width, height, config);
            } catch (RuntimeException e) { 
                // TODO: Test appendHockeyApp() works. 
                App.appendHockeyApp("BitmapCache has "+hashtable.size()+":"+listSize+" request "+width+"x"+height); 
                throw e ; 
            }
        }
    }

    /**
     * Puts a Bitmap object into the cache. 
     * 
     * Note that thread-safety is the caller's responsibility. 
     */
    public void put(Bitmap bitmap) { 
        if (bitmap==null) return ; 
        String key = getKey(bitmap); 
        ArrayList<Bitmap> list = getList(key); 
        list.add(bitmap); 
    }

    private ArrayList<Bitmap> getList(String key) {
        ArrayList<Bitmap> list = hashtable.get(key);
        if (list==null) { 
            list = new ArrayList<Bitmap>(); 
            hashtable.put(key, list); 
        }
        return list;
    } 

    private String getKey(Bitmap bitmap) {
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        Config config = bitmap.getConfig();
        return getKey(width, height, config);
    }

    private String getKey(int width, int height, Config config) {
        sb.setLength(0); 
        sb.append(width); 
        sb.append("x"); 
        sb.append(height); 
        sb.append(" "); 
        switch (config) {
        case ALPHA_8:
            sb.append("ALPHA_8"); 
            break;
        case ARGB_4444:
            sb.append("ARGB_4444"); 
            break;
        case ARGB_8888:
            sb.append("ARGB_8888"); 
            break;
        case RGB_565:
            sb.append("RGB_565"); 
            break;
        default:
            sb.append("unknown"); 
            break; 
        }
        return sb.toString();
    }

}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.