Android第一次活动没有真正销毁
当我用AndroidDeviceMonitor调试我的应用时,发现我的应用堆很奇怪。启动应用程序(SplashActivity - > MainActivity)后,“1字节数组”分配了42MB。我确信SplashActivity已被破坏,我正在使用LeakCanary来发现是否有任何内存泄漏。但我没有找到任何东西。Android第一次活动没有真正销毁
然后我尝试在没有任何其他代码的情况下创建一个新的SplashActiviy,只需setContentView
的onCreate()
方法。
布局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。所以,我想问题是图像资源没有被回收。任何人都可以告诉我更多关于第一次启动活动的细节。为什么它不释放这些资源?
如何确保imge图像被释放以进行垃圾回收可以在onStop中将图像设置为null,以确保没有任何内容引用它。
@Override
public void onStop() {
super.onStop();
mImageView.setImageDrawable(null);
}
然后,您可以使用AndroidDeviceMonitor强制执行垃圾回收以确保它从堆中释放。
是的,我试过了。它真的从堆中释放出来,但我很好奇。为什么在完成SplashActivity后,这些内存没有被释放。我总是需要像'mImageView.setImageDrawable(null);'? –
这可能是多种原因。 SplashActivity没有真正完成,或者您在应用程序中的其他地方使用该图像,并继续参考它。 – Eoin
此外,随着Java垃圾收集它不会一直清除内存。它只会在JVM认为需要基于Java堆大小的垃圾回收时触发。 阅读更多:http://javarevisited.blogspot.com/2011/04/garbage-collection-in-java.html#ixzz3fTEn3RhT – Eoin
我可以看到您用来启动MainActivity的意图吗? – Eoin
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 –
当你在主要活动中按下后退按钮,启动画面没有了吗? – Eoin