2012-12-31 13 views
16

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

private class ImagePagerAdapter extends PagerAdapter { 

    private int[] mImages = new int[] { R.drawable.copertinai, 
      R.drawable.blui, R.drawable.azzurroi, R.drawable.rossoi, 
      R.drawable.gialloi, R.drawable.verdei, R.drawable.rosai, 
      R.drawable.grigioi, R.drawable.neroi, R.drawable.arancionei, 
      R.drawable.marronei, R.drawable.violai, R.drawable.ulm }; 

    @Override 
    public int getCount() { 
     return mImages.length; 
    } 

    @Override 
    public boolean isViewFromObject(View view, Object object) { 
     return view == ((RelativeLayout) object); 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     Context context = MainActivity.this; 
     RelativeLayout relLayImageView = new RelativeLayout(context); 
     relLayImageView.setBackgroundResource(mImages[position]); 

     ((ViewPager) container).addView(relLayImageView, new LayoutParams(
       LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 
     return relLayImageView; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     ((ViewPager) container).removeView((RelativeLayout) object); 
     object=null; 
     System.gc(); 
    } 
} 

कुछ उपकरणों में यह स्मृति exceptionr के बाहर बेतरतीब ढंग से जब कोड की इस पंक्ति

relLayImageView.setBackgroundResource(mImages[position]); 

लेकिन सभी उपकरणों मैं में कुछ इस तरह दिखाई में कहा जाता है कारण: यह मेरा कस्टम PagerAdapter है logcat जब मैं बारी पृष्ठों:

12-31 00:25:31.655: I/dalvikvm-heap(9767): Grow heap (frag case) to 50.875MB for 10384016-byte allocation 

एप्लिकेशन भी एक ही समस्या के लिए कुछ उपकरणों में दुर्घटनाओं एक और गतिविधि में मैं अलग पृष्ठभूमि संसाधन सेट जब उपयोगकर्ता कार्रवाई के आधार पर मुख्य लेआउट में। यहाँ कोड:

  btn.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 


       colorButtons.get(indiceColoreAttuale).setBackgroundResource(
           unSelectedColorsRes[indiceColoreAttuale]); 

       switch (index) { 
       case 0: 
        mainLayout.setBackgroundResource(R.drawable.blus); 
        break; 
       case 1: 
        mainLayout 
          .setBackgroundResource(R.drawable.azzurros); 
        break; 
       case 2: 
        mainLayout 
          .setBackgroundResource(R.drawable.rossos); 
        break; 
       case 3: 
        mainLayout 
          .setBackgroundResource(R.drawable.giallos); 
        break; 
       case 4: 
        mainLayout 
          .setBackgroundResource(R.drawable.verdes); 
        break; 
       case 5: 
        mainLayout 
          .setBackgroundResource(R.drawable.rosas); 
        break; 
       case 6:      
        mainLayout 
          .setBackgroundResource(R.drawable.grigios); 
        break; 
       case 7: 
        mainLayout 
          .setBackgroundResource(R.drawable.neros); 
        break; 
       case 8: 
        mainLayout 
          .setBackgroundResource(R.drawable.arancios); 
        break; 
       case 9: 
        mainLayout 
          .setBackgroundResource(R.drawable.marrones); 
        break; 
       case 10: 
        mainLayout 
          .setBackgroundResource(R.drawable.violas); 
        break; 
       } 

       mainLayout.startAnimation(animationShowTextColor); 
       mainLayout.setGravity(Gravity.CENTER_HORIZONTAL); 
       indiceColoreAttuale = index; 
       colorButtons.get(index).setBackgroundResource(
         selectedColorsRes[index]); 

      } 
     }); 

यह excepiton फिर से चलाता है जब मैं setBackgroundResource() mainLayout पर कॉल करें।

मुझे उम्मीद है कि आप इसे हल करने में मेरी मदद कर सकते हैं, अग्रिम धन्यवाद!

+0

लगता है जैसे आप कुछ _huge_ पृष्ठभूमि लोड कर रहे हैं और डिवाइस में उनके लिए पर्याप्त स्मृति नहीं है ... –

+0

हाँ, लेकिन कभी-कभी बहुत सारी मेमोरी वाले उपकरणों पर होता है, और कम स्मृति वाले उपकरणों में नहीं होता .. I लोड छवियां जो वास्तव में बड़ी नहीं हैं (50 से 200 केबी तक)। – TheModularMind

+0

वे _huge_ नहीं लगते हैं। पृष्ठभूमि संसाधन को बदलने से पहले आप बिटमैप्स को रीसायकल करने का प्रयास कर सकते हैं। पुरानी पृष्ठभूमि को आकर्षित करने के बाद और इसे बदलने के बाद देखें कि क्या यह 'बिटमैप ड्रायबल' है, यदि यह है तो उसे 'बिटमैप' पर 'रीसायकल()' पर कॉल करें। –

उत्तर

57

मैंने हल किया! आपके सभी संकेत अच्छे थे लेकिन असली समस्या "/ खींचने योग्य" फ़ोल्डर थी! मेरे पास "/ drawable" जेनेरिक फ़ोल्डर में सभी चित्र थे जिन्हें "/ drawable/mdpi" जैसे सिस्टम द्वारा माना जाता है, इसलिए जब मैं hdpi के साथ डिवाइस में चल रहा था या अधिक छवियों का आकार बदल गया था, और बहुत बड़ा हो गया जो OutOfMemoryException का कारण बनता है!

अब मैं अपनी छवियों को स्टोर करने के लिए "/ drawable-nodpi" का उपयोग कर रहा हूं। यह फ़ोल्डर "/ drawable" जैसा काम करता है लेकिन छवियों का आकार कभी नहीं बदला जाता है!

+1

मुझे लगता है कि आपका मतलब है 'drawable-nodpi' –

+0

धन्यवाद, एक आकर्षण की तरह काम करता है! – ElDoRado1239

+0

मैंने स्मृति उपयोग में एक महत्वपूर्ण गिरावट देखी है। क्या इस समाधान में कोई कमी है? –

8

प्रत्येक एंड्रॉइड एप्लिकेशन में सीमित स्मृति (ढेर) है जिसका उपयोग दलविक वीएम द्वारा किया जा सकता है। यह 64 एमबी है कुछ उपकरणों पर 32 एमबी है। जब आप पृष्ठभूमि संसाधन सेट करते हैं तो आप उस संसाधन को ढेर पर लोड करते हैं। वह संसाधन बिटमैप के रूप में लोड किया गया है - इसका आकार चौड़ाई * ऊंचाई * पिक्सेल आकार है। Usualy बिटमैप्स को एआरजीबी छवियों के रूप में लोड किया जाता है जिसमें प्रति पिक्सेल 4 बाइट्स होते हैं। इसका मतलब है कि 1024x768 छवि लोड करना 1024 * 768 * 4 = 3145728 बी = 3072 केबी = 3 एमबी ढेर पर लेता है। जब आप बड़ी बड़ी छवियों को लोड करते हैं तो यह सभी मुफ्त ढेर मेमोरी का उपभोग करता है और स्मृति अपवाद से बाहर होता है।

इसे ठीक करने के लिए छवियों को लोड करने के लिए बेहतर है जितना आप कर सकते हैं - जब आप छवि के थंबनेल को प्रदर्शित कर रहे हैं तो इसे संकल्प में लोड करने के लिए पर्याप्त है जो प्रदर्शन के ठोस भाग के संकल्प से काफी बड़ा नहीं है। इसका मतलब है कि जब आप 800x600 डिस्प्ले पर अपनी छवि प्रदर्शित करते हैं तो यह 1024x768 छवि लोड करने के लिए पर्याप्त नहीं है। आप छोटे रिज़ॉल्यूशन में छवि लोड करने के लिए बिटमैप फैक्टरी का उपयोग कर सकते हैं।

विधि डीकोड संसाधन (गतिविधि .getResources(), R.drawable.imageId, opts) का उपयोग करें। BitmapFactory.Options opts में पैरामीटर inSampleSize है जहां आप छवि का सबसमलिंग सेट कर सकते हैं। जब आपको पारदर्शिता की आवश्यकता नहीं होती है तो भी पैरामीटर inPreferredConfig का उपयोग ARGB_8888 के बजाय RGB_565 सेट करने के लिए किया जा सकता है।

+0

इन सूचनाओं के लिए धन्यवाद आदमी। –

संबंधित मुद्दे