5

मेरे पास सेवा है जो विशेष रूप से एक गतिविधि दिखाएगी, प्रत्येक 13 वीं बार उस गतिविधि के बाद मैं एक एडोब इंटरस्टिशियल विज्ञापन दिखा रहा हूं। इंटरस्टिशियल विज्ञापन दिखाए जाने पर मेरे एप्लिकेशन का रैम उपयोग 20 एमबी तक बढ़ रहा है और उसके बाद इसे कचरा नहीं मिला है। अगले 13 वें समय जब एक और अंतरालीय विज्ञापन दिखाया गया है तो सेवा मेमोरी में कोई वृद्धि नहीं हुई है।एडमोब इंटरस्टिशियल विज्ञापनों का उपयोग करते समय मेमोरी लीक

दिखाए जाने वाले विज्ञापनों के लिए मेरे कोड:

public void loadAndShowInterstitialAd() { 
     interstitial = new InterstitialAd(getApplicationContext()); 
     interstitial.setAdUnitId(AD_UNIT_ID); 

     final AdRequest adRequest = new AdRequest.Builder() 
       .build(); 

     Handler handler = new Handler(new Handler.Callback() { 

      @Override 
      public boolean handleMessage(Message msg) { 
       interstitial.loadAd(adRequest); 
       return true; 
      } 
     }); 

     if (handler != null) { 
      handler.sendEmptyMessageDelayed(0, 200); 
     } 

     interstitial.setAdListener(new AdListener() { 
      @Override 
      public void onAdLoaded() { 
       super.onAdLoaded(); 
       displayInterstitial(); 
      } 

     }); 
    } 

    public void displayInterstitial() { 
     if (interstitial.isLoaded()) { 
      interstitial.show(); 
     } 
    } 

मैं निम्नलिखित ढेर अतिप्रवाह सवाल में कुछ समाधान की कोशिश की है, लेकिन कुछ भी मेरे लिए काम किया।

Android Admob Interstitial Memory leak

Android AdMob causes memory leak?

उत्तर

2

मैं किसी अन्य प्रक्रिया में विज्ञापन गतिविधि चलाकर इस समस्या को हल करने में कामयाब रहे है। मुझे लगता है कि कुछ कारणों से, एंड्रॉइड गतिविधियों की आवश्यकता के मुकाबले अधिक समय के लिए प्रक्रिया मेमोरी में रखता है। उम्मीद है कि इससे किसी को इस मुद्दे को ठीक करने में मदद मिलेगी। अपनी गतिविधि में, OnDestroy() में:

+0

क्या आपके पास कोई उदाहरण है? मैं पहले से ही एक ही समस्या के साथ सबकुछ कोशिश कर रहा हूं लेकिन इसे नहीं मिला। क्या आपने इसके लिए एक नई कक्षा बनाई है? – Riverside

+1

एंड्रॉइड का उपयोग करें: विभिन्न प्रक्रियाओं में चलाने के लिए गतिविधियों को अलग करने के लिए प्रक्रिया विशेषता। यह मेरी समस्या हल हो गई। अपनी परियोजना के लिए उचित रूप से इसका इस्तेमाल करें। – venkat

+0

किसी अन्य प्रक्रिया में चलने से मेरे लिए समस्या हल नहीं होती है। – frankish

6

मैं आज इस मुद्दे पर भाग गया, अंत में मैं इसका कोई सुधार

  • अगर कोई ऐसा adview है, यह अपने लेआउट से हटाने को शून्य पर adview सेट ।
  • सभी विज्ञापनसूची को शून्य पर सेट करें।

    @Override 
        public void onDestroy(){ 
         super.onDestroy(); 
         mMainView.removeView(adView); 
         adView = null; 
         interstitial.setAdListener(null); 
        } 
    

    आपके मामले में, शायद विज्ञापनदाता को शून्य पर सेट करना पर्याप्त है।

पी/एस:

क्योंकि लीक कई मायनों में हो, किसी को याद करते हैं सिर्फ मामले में यह: बीच में आने वाले Context.getApplicationContext का उपयोग कर() (जैसे क्या ओपी किया) प्रारंभ करने में याद है, आपकी गतिविधि से नहीं - जो पूरी तरह से रिसाव बनाता है - क्योंकि इंटरस्टिशियल अब आपकी गतिविधि का संदर्भ रखता है, और यह कभी नहीं छोड़ता है, इसलिए कभी भी अपनी गतिविधि को जाने दें ...

Interstitial interstitial = new Interstitial(getApplicationContext()) 
+0

इसे आज़माकर, ऐसा लगता है कि इस मुद्दे को हल करना प्रतीत होता है क्योंकि इंटरस्टिशियल से शुरू की गई गतिविधि के कई उदाहरण नहीं हैं। हालांकि, कुछ अभी भी सही नहीं है। अगर बैठने और विज्ञापनों को लोड करने के लिए रातोंरात छोड़ दिया जाता है तो यह अभी भी स्मृति को जमा करता है। मुझे लगता है कि यह एक Google एसडीके वर्ग है लेकिन शायद गलती कहीं भी ऐप में है। – Sojurn

+0

यह विज्ञापन सक्रियता ऑब्जेक्ट को लीक करने से नहीं रोकता है। प्रत्येक इंटरस्टिशियल के साथ विज्ञापन क्रियाशीलता की कई प्रतियां दिखाई देगी ... – frankish

+0

@ फ्रैंकिश इस मुद्दे के AdMob की तरफ है, हमारे पास AdActivity पर कोई नियंत्रण नहीं है। मेरा दृष्टिकोण उतना कठिन प्रयास है जितना हम अपने पक्ष में कर सकते हैं जहां हमारे पास पूर्ण शक्ति है, हमारी प्रत्येक लिखित गतिविधि है। आपकी समस्या के बारे में, क्या यह अभी ठीक है? – DuDu

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