2010-02-03 12 views
20

का कारण बनता है मैं एक imageView और एक बटन के साथ एक बहुत ही सरल अनुप्रयोग है। मेरी imageView द्वारा लोड पहले Drawable संसाधन के साथ निर्दिष्ट किया जाता है "एंड्रॉयड: src" एक्सएमएल लेआउट में टैग, तथापि रनटाइम पर मैं परिवर्तन चित्र यह द्वारा प्रदर्शित करना चाहते हैं। ऐसा करने के लिए मैं एसडी कार्ड से एक छवि लेने के लिए परिणाम के लिए एक गतिविधि शुरू करता हूं (MediaStore.Images.Media.EXTERNAL_CONTENT_URI को भेजा गया इरादा)। लेकिन जब चित्र चुना जाता है, मैं चुना चित्र के यूआरआई के साथ imageView अपडेट करने का प्रयास, लेकिन मैं संदेश मिलता है:बदलने imageView सामग्री OutOfMemoryError

I'am लिए गए चित्रों लोड करने का प्रयास "java.lang.OutOfMemoryError बिटमैप आकार वीएम बजट से अधिक है" कैमरे के साथ मेरी एचटीसी-हीरो, लेकिन कोई सफलता का (चित्र आकार 1.1M के आसपास रहे हैं), केवल कि 500KB.However मैं कैमरे से लिए गए चित्रों को लोड करने की जरूरत की तुलना में कम कर रहे हैं चित्रों के साथ काम करने के लिए लगता है। मैं इसे कैसे हल कर सकता हूं? मैं क्या गलत कर रहा हूँ। मुझे लगता है कि कोड बहुत सरल है और काम करना चाहिए।

public void onClick(View v){ 
Intent selectImageIntent=new Intent(Intent.ACTION_PICK , 
    android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
    startActivityForResult(selectImageIntent,1); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data){ 
super.onActivityResult(requestCode, resultCode, data); 
if(resultCode==Activity.RESULT_OK){ 
    Uri selectedImageUri = data.getData(); 
    Log.i(TAG,"chosen image: "+selectedImageUri.toString()); 
    ImageView imageView = (ImageView) this.findViewById(R.id.ImageView01); 
    imageView.setImageURI(selectedImageUri);//here I get the OutOfMemoryError 
    imageView.invalidate(); 

}else{ 
    //canceled 
} 

} 

पेज। ऐप को एकमात्र चीज करना चाहिए, मैं अन्य ऑब्जेक्ट्स नहीं बना रहा हूं इसलिए मैं यह इंगित करना चाहूंगा कि मैं छवि को प्रदर्शित करने के अलावा अन्य सामानों के लिए हीप स्पेस का उपयोग नहीं कर रहा हूं।

उत्तर

43

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

((BitmapDrawable)imageView.getDrawable()).getBitmap().recycle();

तो कोड अब इस तरह दिखता है:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data){ 
    super.onActivityResult(requestCode, resultCode, data); 
    switch(requestCode){ 
     case INTENT_REQUEST_SELECT_IMAGE: 
      if(resultCode==Activity.RESULT_OK){ 
       Uri selectedImageUri = data.getData(); 
       Log.i(TAG,"selectedImageUri.getPath()"+selectedImageUri.getPath()); 
       ImageView imageView = (ImageView) this.findViewById(R.id.ImageView_of_text); 
       ((BitmapDrawable)imageView.getDrawable()).getBitmap().recycle(); 
       imageView.setImageURI(selectedImageUri); 
       imageView.invalidate(); 

      }else{ 
       //TODO define what to do in case the user canceled OCR or any other event 
      } 
      break; 
     default: 
      break; 
    } 
} 

कॉल कृपया ध्यान दें imageView के बिटमैप पर पुनरावृत्ति करने के लिए।

2

समस्या अब हल किया गया है। बल्कि केवल एक से लाइन:

((BitmapDrawable)imageView.getDrawable()).getBitmap().recycle(); 

imageView सामग्री अद्यतन करने से पहले इस कोड जोड़ें:

Drawable toRecycle= gallerypic.getDrawable(); 
if (toRecycle != null) { 
    ((BitmapDrawable)gallerypic.getDrawable()).getBitmap().recycle(); 
} 
gallerypic.setImageURI(selectedimage); 
6

यह मैं पागल गाड़ी चला रहा था।

मैं बहुत बड़ी, उच्च-रिज़ॉल्यूशन, पूर्ण स्क्रीन छवियों (800x1232) के साथ एक Xoom के लिए निर्माण कर रहा हूँ।

निम्नलिखित कोड मेरे लिए काम किया:

public void onStop() 
{ 
    super.onStop(); 
    imageView.setImageBitmap(null); 
} 

गुड लक !!!

+0

यह विधि आपको सहेज लेगी यदि आप ImageViews के साथ FragmentStatePagerAdapter का उपयोग कर रहे हैं क्योंकि बिटमैप रीसाइक्लिंग के बाद दृश्य को फिर से भरने में त्रुटि होगी। –

1

केवल छवि दृश्य अपडेट करने से पहले इसका उपयोग करें: imageView1.setImageURI (शून्य);

1

मैंने इस पोस्ट के हर समाधान का उपयोग किया और कई भी काम नहीं किया। आखिर में मैंने android:largeHeap="true" मेनिफेस्ट में उपयोग किया और यह मेरी समस्या हल करता है।

उम्मीद है कि यह किसी की मदद करेगा।