5

Tôi có dịch vụ sẽ hiển thị hoạt động tại thời điểm cụ thể, sau hoạt động đó vào mỗi lần thứ 13 tôi đang hiển thị quảng cáo trung gian admob. Mức sử dụng RAM của ứng dụng của tôi đang tăng 20MB khi quảng cáo trung gian được hiển thị và sau đó quảng cáo không thu thập rác thải. Vào lần thứ 13 tiếp theo khi một quảng cáo xen kẽ khác được hiển thị, không có sự gia tăng trong bộ nhớ dịch vụ.Rò rỉ bộ nhớ trong khi sử dụng quảng cáo trung gian Admob

Mã của tôi cho quảng cáo hiển thị:

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(); 
     } 
    } 

Tôi đã thử vài giải pháp trong câu hỏi stack overflow sau, nhưng không làm việc cho tôi.

Android Admob Interstitial Memory leak

Android AdMob causes memory leak?

Trả lời

2

tôi đã quản lý để khắc phục vấn đề này bằng cách chạy các hoạt động quảng cáo trong quá trình khác. Tôi đoán vì một số lý do, android giữ các hoạt động trong bộ nhớ quá trình cho nhiều thời gian hơn là cần thiết. Hy vọng nó sẽ giúp ai đó khắc phục vấn đề này.

+0

bạn có một ví dụ? Tôi đang cố gắng tất cả mọi thứ đã có cùng một vấn đề nhưng không thể tìm thấy nó. Bạn đã thực hiện một lớp học mới cho điều này? – Riverside

+1

Sử dụng android: thuộc tính quy trình để tách các hoạt động để chạy trong quá trình khác nhau. Điều đó đã giải quyết được vấn đề của tôi. Sử dụng nó một cách thích hợp cho dự án của bạn. – venkat

+0

Chạy trong một quy trình khác không giải quyết được vấn đề cho tôi. – frankish

6

Tôi chạy đến vấn đề này ngày hôm nay, cuối cùng tôi đã có một sửa chữa: Trong hoạt động của bạn, trong onDestroy():

  • Nếu có một AdView, loại bỏ nó từ cách bố trí của bạn, đặt AdView null .
  • Đặt tất cả AdListeners thành null.

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

    Trong trường hợp của bạn, có thể đặt AdListener thành null là đủ.

P/S:

Bởi vì rò rỉ xảy ra trong rất nhiều cách, chỉ trong trường hợp ai đó nhớ này: nhớ để khởi tạo kẽ sử dụng Context.getApplicationContext() (giống như những gì OP đã làm), không phải do hoạt động của bạn - đó hoàn toàn tạo ra một sự rò rỉ - vì kẽ bây giờ có vẻ để giữ một tham chiếu đến hoạt động của bạn, và nó không bao giờ rời khỏi, vì vậy không bao giờ để hoạt động của bạn đi ...

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

Thử cách này, có vẻ như để giải quyết vấn đề vì không còn nhiều phiên bản hoạt động nữa mà quảng cáo xen kẽ được khởi chạy từ đó. Tuy nhiên, điều gì đó vẫn không đúng. Nếu để qua đêm để ngồi và tải quảng cáo nó vẫn tích lũy bộ nhớ ở đâu đó. Tôi nghĩ rằng đó là một lớp học google sdk nhưng có lẽ lỗi vẫn còn trong ứng dụng ở đâu đó. – Sojurn

+0

Điều này không ngăn chặn đối tượng AdActivity bị rò rỉ. Sẽ có nhiều bản sao của AdActivity với mỗi Quảng cáo chuyển tiếp được hiển thị ... – frankish

+0

@frankish Đó là khía cạnh của vấn đề này của AdMob, chúng tôi không có bất kỳ quyền kiểm soát nào đối với AdActivity. Cách tiếp cận của tôi là cố gắng hết sức có thể ở phía chúng tôi, nơi chúng tôi có toàn bộ sức mạnh, mỗi hoạt động được viết riêng của chúng tôi. Làm thế nào về vấn đề của bạn, là nó ok bây giờ? – DuDu