2017-10-17 3 views
-1

Iは、フラグメントでアクティビティを実装します。どの断片でも、私はRecyclerViewを実装しました。 RecyclerViewでは、n番目の行ごとに、すでにビューを保持しているMyシングルクラスから静的ビューをアタッチしました。アクティビティのonDestroyでは、GridLayoutManagerからすべてのビューを削除し、RecyclerViewからすべてのビューを削除し、アダプタオブジェクトをクリアします。すべてを行った後、私は私のシングルトンクラスから静的ビューもクリアします。しかし、LeakCanaryは、特定の行へのアクティビティのメモリリークを検出します。メモリリークを回避する方法と、静的コンテキストを保持するビューを削除する方法アクティビティインスタンスリークメモリ

int adPosition = FacebookAdCenter.getInstance().getAdPosition(position); 
     View adView; 
     if (adPosition >= 0) { 
      adView = FacebookAdCenter.getInstance().getNativeAdViewWithAdPosition(adPosition); 
     } else { 
      adView = null; 
     } 
     if (adView == null) { 
      adView = FacebookAdCenter.getInstance().getNativeAdView(position); 
      if (adView.getParent() != null) { 
       ((ViewGroup) adView.getParent()).removeView(adView); 
      } 
      itemView.addView(adView); 
     } else { 
      if (adView.getParent() != null) { 
       ((ViewGroup) adView.getParent()).removeView(adView); 
      } 
      itemView.addView(adView); 
     } 

実際にFacebook広告をキャッシュして1時間再利用したいと思っています。しかし、残念ながら私はまだこれで成功していません。ストア広告にスタティックリファレンスを使用すると、メモリリークが発生します。私はFacebook広告を適切にキャッシュする他の方法を知らない。

答えて

0

n番目のアイテムの行ビューごとにRecyclerViewで、ビューを保持している私のシングルトンクラスから静的ビューを添付しました。

これを行わないでください。メモリを避ける方法

static分野からの意見を参照しないでください

を漏らします。

Java全体では、変更可能なstaticフィールド(つまり、定数ではない)はコードの匂いです。 Androidではもう少し許容しますが、ほとんどの場合、キャッシュやコンポーネント間の通信の仲介に使用されます。 Viewは、コンポーネント(アクティビティ)間で再利用することはできません。

+0

アクティビティインスタンスのメモリをリークすることなく、アプリケーションで30分以上データを保持したい場合、どうすればよいですか? –

+0

@WakilAhmad:UIウィジェット、アクティビティなどではなく* data *を保持してください。古い古いJavaオブジェクト(POJO)は問題ありません。 – CommonsWare

+0

私はFacebookのネイティブ広告を保持したいと思います。それが正しいか?そうでない場合は、ネイティブ広告を1時間キャッシュする方法を教えてください。 –