2017-03-08 109 views
3

我有一個活動,它可以在帶有滑動的ImageView中加載圖片。這裏是我的滑翔代碼示例: Glide.with(ImageVOne.getContext()) .load(geoInfo.getPhotoUrl1()) .skipMemoryCache(真) .priority(Priority.NORMAL) .into(ImageVOne) ; 我從1到35張圖片加載,每張圖片應在150ko & 250ko之間。我無法減少這一點。Android內存泄漏滑行

此活動可以在主要活動的會話中多次訪問,並且每次加載不同的圖片。例如在第一時間將是華盛頓的照片,那麼倫敦的圖片等

我的問題是,使用的內存增加了不少每一個加載圖片的活動開始時間: enter image description here

我可以從3到5次啓動活動,然後應用程序崩潰。該錯誤消息是 java.lang.OutOfMemoryError:無法分配與1126320個免費字節,1099KB一個1411340字節分配,直到OOM

我讀posts about memory leaks但我認爲滑翔會避免這個問題。我的照片活動在另一張照片開始之前完成,但分配給我的應用的內存似乎沒有下降。 我還在Manifest中對我的圖片活動添加了android:noHistory =「true」,但它不會改變任何內容。

我在我的Manifest中添加了android:largeHeap =「true」,但它只是推遲了我的問題(我可以啓動約10到15次的圖片活動),並且在應用前我的圖片查看中有很多照片未加載崩潰,所以它不是一個很好的解決方案。

我也嘗試添加.skipMemoryCache(真),當我使用滑翔,但我沒有注意到任何改變。

我想我的「內存使用」應該減少每次我從圖片活動主要活動,然後增加,當我開始我的圖片活動再次與新的圖片。但從我在藍色圖表上看到的情況幾乎只會增加。你看到我該怎麼辦?

謝謝

亞歷

+0

ü完成活動每次回壓所使用的生命週期? –

+0

您是否嘗試從活動上下文中調用滑動,而不是圖像上下文?我最好的猜測是,沒有什麼可以被GC'd,因爲Glide以某種方式持有對圖像的引用。將Glide.with(ImageVOne.getContext())更改爲Glide.with(this)(這指的是ActivityB) – NSimon

+0

@ Alex9494您可以檢查我的答案,這可能會有所幫助。 – tahsinRupam

回答

0

利用Glide不會是內存泄漏的問題,您可以讓您的活動像聽衆的一些其他的參考,或您忘記註銷已經註冊的東西,而開始這將導致你的整個活動無法得到垃圾收集的活動。

因此,每次啓動活動或片段時,都會創建新實例,而舊實例也會因爲任何未註冊的罪魁禍首而保留在內存中。

使用Eclipse MAT找到您的泄漏。

0

您可以採取多種措施來防止出現內存不足錯誤。他們如下。

  1. 使用GridView/RecycleView顯示圖像。因爲他們只加載他們展示的內容。假設你有50張圖片,10張圖片對你的屏幕是可見的,它只會加載10張。這將緩解你記憶中的壓力。

  2. 使用PLACEHOLDER來加載圖像而不是黑色空間。您可以使用低分辨率圖像作爲佔位符。

  3. 使用THUMBNAILS而不是實際的圖像。

  4. 您可以使用固定的dp作爲imageView的高度和寬度。

  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

哦,很普通!不要高估自己。我遇到了類似的問題,並嘗試了各種解決方案。所以我試圖在一個答案中提出所有的解決方案。沒有時間查看僅在一週前發佈的答案。此外,還有很多更好的答案可用,那麼爲什麼要麻煩呢? – tahsinRupam

+0

與滑翔4.x它不是最好的解決方案了 Glide.get(上下文)。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。通過將Glide與Application Context一起使用,您告訴Glide會遵循應用程序的生命週期,並且而不是您的Activity的生命週期,導致在您退出上述Activity時,Glide映像負載不會被取消或清除。

所以改爲使用:Glide.with(MyActivity.this)...

注:總比分扳成你的滑翔負載請求到最近的可能的生命週期,以確保滑翔如下,它在