【发布时间】:2015-03-18 06:20:56
【问题描述】:
我创建了非常简单的活动 TempActivity,没有内容视图,仅用于测试目的。当这个活动加载到 android 手机中时,我做了大约 40 次方向更改,我将堆文件作为 hprof 并导出到 MAT 工具并检查。它显示了我的 TempActivity 的 40 个实例,并且在每个实例中都有许多用于操作栏视图的类,例如线性布局、图像视图等。
每当我旋转屏幕时,DDMS 都会显示越来越多的内存添加到此应用程序的堆中,理想情况下它不应该在一段时间后被垃圾收集吗?当我强制执行 GC 时,它仍然没有被清除,并且显示堆内存增加。
请告诉我这是 Android 的默认行为,我们可以做些什么来删除所有以前的活动实例吗?这是内存泄漏的情况吗?因为在我的实时应用程序中(在 contentview 中包含图像和其他内容),当我旋转屏幕时,我会遇到同样的问题,每次创建新的实例活动并且堆大小不断增加。
难道不是因为默认的ActionBar imageview、linearlayout或者其他控件自动内置每个android Activity吧?
这是我的临时活动课程:
[Activity(Label = "TempAcivity", MainLauncher = true)]
public class TempAcivity : Activity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
// Create your application here
}
}
编辑
这是我申请的清单文件和样式文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="HF.Mobility.Android" android:versionCode="1" android:versionName="1.0" android:installLocation="auto">
<uses-sdk android:minSdkVersion="10" android:targetSdkVersion="21" />
<application android:label="Health Hub" android:theme="@style/CustomHoloTheme" android:icon="@drawable/ApplicationIcon" android:allowBackup="false">
<application android:label="@string/ApplicationName"></application>
</application>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.VIBRATE" />
</manifest>
样式文件:
<?xml version="1.0" encoding="utf-8" ?>
<resources>
<style name="CustomHoloTheme" parent="@android:style/Theme.Holo.Light">
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowActionBarOverlay">true</item>
<item name="android:icon">@android:color/transparent</item>
<item name="android:actionBarStyle">@style/MyTheme.ActionBarStyle</item>
<item name="android:itemTextAppearance">@style/myCustomMenuTextApearance </item>
<item name="android:typeface">monospace</item>
</style>
<style name="MyTheme.ActionBarStyle" parent="@android:style/Widget.Holo.Light.ActionBar">
<item name="android:titleTextStyle">@style/MyTheme.ActionBar.TitleTextStyle</item>
<item name="android:background">@drawable/actionbar_background</item>
</style>
<style name="MyTheme.ActionBar.TitleTextStyle" parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Title">
<item name="android:textColor">#FFFFFF</item>
</style>
<style name="myCustomMenuTextApearance" parent="@android:style/TextAppearance.Widget.IconMenu.Item">
<item name="android:textColor">@color/xam_green</item>
</style>
</resources>
这是 actionbar_background.xml 文件:
<?xml version="1.0" encoding="utf-8" ?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<solid android:color="#00000000" />
</shape>
</item>
</layer-list>
【问题讨论】:
-
请发布您的清单文件。
-
每当您更改屏幕方向活动时,都会再次重新创建,因此每次都会调用 onCreate。但是如果你想管理对象或者你不想每次都创建对象,那么你应该在 onSaveInstanceState 方法中将对象保存在 bundle 中,并在 onCreate 中检查它的实例...
-
Dispose Activity 在它的
OnDestroy方法中以中断对等对象连接。我在这里的另一个答案涵盖了更深入的情况:stackoverflow.com/questions/28863058/…
标签: android memory-leaks xamarin garbage-collection screen-orientation