2017-03-08 114 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)...

注:总比分扳成你的滑翔负载请求到最近的可能的生命周期,以确保滑翔如下,它在