Android第一次活动没有真正销毁

问题描述:

当我用AndroidDeviceMonitor调试我的应用时,发现我的应用堆很奇怪。启动应用程序(SplashActivity - > MainActivity)后,“1字节数组”分配了42MB。我确信SplashActivity已被破坏,我正在使用LeakCanary来发现是否有任何内存泄漏。但我没有找到任何东西。Android第一次活动没有真正销毁

然后我尝试在没有任何其他代码的情况下创建一个新的SplashActiviy,只需setContentViewonCreate()方法。

布局XML是这样的:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:layout_gravity="center" 
android:gravity="center"> 
<ImageView 
    android:id="@+id/splash" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:scaleType="fitXY" 
    android:src="@drawable/splash2"/> 
<ImageView 
    android:id="@+id/logo" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:scaleType="fitCenter" 
    android:src="@drawable/splashlogo"/> 
</RelativeLayout> 

我再次调试和 “1字节数组” 仍然是42MB。然后,我尝试从我的布局中删除src标记。 “1字节数组”减少到35MB。所以,我想问题是图像资源没有被回收。任何人都可以告诉我更多关于第一次启动活动的细节。为什么它不释放这些资源?

+0

我可以看到您用来启动MainActivity的意图吗? – Eoin

+0

Intent intent = new Intent(this,MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK \t \t \t \t \t \t | Intent.FLAG_ACTIVITY_NEW_TASK); this.startActivity(intent); this.finish(); 也tryed删除这些标志,得到了相同的结果@ Modge –

+0

当你在主要活动中按下后退按钮,启动画面没有了吗? – Eoin

如何确保imge图像被释放以进行垃圾回收可以在onStop中将图像设置为null,以确保没有任何内容引用它。

@Override 
public void onStop() { 
    super.onStop(); 

    mImageView.setImageDrawable(null); 
} 

然后,您可以使用AndroidDeviceMonitor强制执行垃圾回收以确保它从堆中释放。

+0

是的,我试过了。它真的从堆中释放出来,但我很好奇。为什么在完成SplashActivity后,这些内存没有被释放。我总是需要像'mImageView.setImageDrawable(null);'? –

+0

这可能是多种原因。 SplashActivity没有真正完成,或者您在应用程序中的其他地方使用该图像,并继续参考它。 – Eoin

+0

此外,随着Java垃圾收集它不会一直清除内存。它只会在JVM认为需要基于Java堆大小的垃圾回收时触发。 阅读更多:http://javarevisited.blogspot.com/2011/04/garbage-collection-in-java.html#ixzz3fTEn3RhT – Eoin