2017-03-08 8 views
3

私は、グライドでImageViewsの画像を読み込むアクティビティを持っています。ここに私のグライドコードのサンプルは次のとおりです。 Glide.with(ImageVOne.getContext()) .LOAD(geoInfo.getPhotoUrl1()) .skipMemoryCache(真) .priority(Priority.NORMAL) .into(ImageVOne) ; 1から35までの画像を読み込み、各画像は150ko & 250koの間にある必要があります。私はそれを減らすことはできません。Androidのメモリリークグライド

このアクティビティには、メインアクティビティからセッションで複数回アクセスしたり、別の写真をロードするたびにアクセスできます。例えばそれは、ワシントンの写真になります最初の時間は、その後、ロンドンの写真など

私の問題は、メモリの使用がたくさんに画像をロードする活動が開始されるたびに増加していることである: enter image description here

I 3〜5回アクティビティを開始すると、アプリがクラッシュします。エラーメッセージが java.lang.OutOfMemoryErrorを次のとおりです。OOM

まで1126320空きバイトと1099キロバイトで1411340バイトの割り当てを割り当てることができませんでした私はposts about memory leaksを読んで、私はグライドは、この問題を回避するだろうと思いました。写真を使った私の活動は、別のものが始まる前に終わっていますが、私のアプリケーションに割り当てられたメモリは落ちていないようです。 また、マニフェストの画像アクティビティにandroid:noHistory = "true"を追加しましたが、何も変更されません。

私のマニフェストではアンドロイド:largeHeap = "true"を追加しましたが、問題が延期されました(写真アクティビティを約10〜15回開始できます)。アプリの前に画像ビューで読み込まれない写真がたくさんあります。クラッシュ、それは私にとっては良い解決策ではありません。

グライドを使用すると.skipMemoryCache(true)を追加しようとしましたが、変更に気付きません。

写真のアクティビティからメインアクティビティに移動するたびに「メモリ使用量」が減少してから、新しい写真で再びアクティビティを開始すると増加するはずです。しかし、私が青いグラフで見るものから、それはほとんど増加するだけです。私は何をすべきか見ていますか?

はグライドを使用すると、メモリリークの問題ではないでしょうアレックス

+0

に使われていることをライフサイクルを次のuが活動に押し戻されるたびを終えましたか? –

+0

イメージコンテキストではなく、アクティビティコンテキストからグライドを呼び出そうとしましたか?グライドはどういうわけか、画像への参照を保持しているので、私の最高の推測はGCができないということです。 Glide.with(ImageVOne.getContext())をGlide.with(これはActivityBを参照してください)に変更してください。 – NSimon

+0

@ Alex9494私の答えを確認してください。役立つかもしれません。 – tahsinRupam

答えて

0

、リスナーのようなあなたの活動のいくつかの他の参照を保持するか、または起動しているときに登録されている何かの登録を解除するのを忘れて、

をありがとうあなたの全体の活動ができなくなるアクティビティはガベージコレクションを取得します。

したがって、アクティビティまたはフラグメントを開始するたびに、新しいインスタンスが作成されますが、古いインスタンスも登録されていない犯人インスタンスのためにメモリ内に保持されます。

Eclipse MATあなたのリークを見つけるには。

0

メモリ不足エラーを防ぐには、いくつかの対策が必要です。彼らは以下の通りです。

  1. GridView/RecycleViewを使用してイメージを表示する。彼らは彼らが示すものだけをロードするからです。 50枚の画像があり、画面に10枚の画像が表示されていれば、10枚しか読み込まれません。これにより、メモリの負荷が軽減されます。

  2. 「スペースホルダー」を使用すると、黒いスペースではなく画像を読み込むことができます。 Drawableの低解像度イメージをプレースホルダとして使用できます。

  3. 実際の画像の代わりにTHUMBNAILSを使用してください。

  4. imageViewの高さと幅に固定のdpを使用できます。

  5. skipMemoryCacheをtrueに設定します。

  6. CLEAR GLIDE memory onDestroy();

    @Override public void onDestroy() { 
        super.onDestroy(); 
        Glide.get(this).clearMemory(); 
    } 
    
  7. 小さいサイズへの上書き:

    .override(500, 600) //as example 
    

    ここでは、GLIDEを使用するための洗練されたコードです:

    Glide.with(this) 
         .load(url) 
         .thumbnail(0.5f) 
         .skipMemoryCache(true) 
         .diskCacheStrategy(DiskCacheStrategy.ALL) 
         .placeholder(R.drawable.your_placeHolder) 
         .into(imageVOne); 
    

あなたはグライドhereのメカニズムを引く見てもよいです。

+0

うん、確かに、この回答の荒廃したバージョンのように見える:https://stackoverflow.com/a/43713485/2371425 – Sakiboy

+0

ああ、一般的です!あなた自身を過大評価しないでください。私は同様の問題に直面し、さまざまな種類のソリューションを試しました。そこで、すべてのソリューションを1つの答えで提示しようとしました。ちょうど1週間前に投稿された回答を見る時間がなかった。さらに、より多くのより良い回答がありますので、なぜそれほど気になりますか? – tahsinRupam

+0

グライド4.xを使用すると、これ以上最適なソリューションではありません。 Glide.get(context)。clearMemory(); すべてのメモリをクリアすることは特に効率的ではないので、できるだけジャンクや積載時間の増加を避けるために避けるべきです。 http://bumptech.github.io/glide/doc/caching.html#memory-cache – SjoerdvGestel

0

Here is a sample of my glide code : Glide.with(ImageVOne.getContext()) .load(geoInfo.getPhotoUrl1()) .skipMemoryCache(true) .priority(Priority.NORMAL) .into(ImageVOne);

この問題の原因は、おそらくGlide.with(ImageVOne.getContext())...です。 View.getContext()Application Contextを返すので、これをしたくないです。 Application ContextでGlideを使用すると、アプリケーションのライフサイクルに従うようにGlideに指示しています。あなたのActivityのライフサイクルは、Activityから戻ったときにGlideイメージの読み込みがキャンセルまたはクリアされることはありません。

代わりに、Glide.with(MyActivity.this)...を使用してください。

注:は、必ずそのグライドを確保するためにできるだけ近いライフサイクルにあなたのグライドロード要求を結ぶことが

関連する問題