在我的 Xamarin android 应用程序中,当应用程序启动时,我会显示闪屏 3 秒。在此期间,我为创建 sqlite 表做后台工作,如果需要登录,从 web 加载用户信息。这些任务是使用异步方式完成的。
我为 splashactivity 分配了主题,在该主题中,我将背景分配为一个 37 KB 大小的 jpeg 文件,尺寸为 400*692。
3 秒后,我导航到我的 startActivity,在 SplashScreen 活动的 onDestroy 中,我将另一个主题分配给背景设置为 null 的窗口。但是,如果我对堆进行快照并在 MAT 中进行检查,它仍然显示具有泄漏嫌疑的 SplashActivity 具有 4.4 MB(占总堆的 13%)。我正在为 SplashActivity 以及样式附加代码。
请让我知道如何避免这种泄漏?
[Activity(Theme = "@style/Theme.SplashActivity", MainLauncher = true, NoHistory = true, ScreenOrientation = ScreenOrientation.Portrait)]
public class SplashScreen : BaseActivity
{
private AndroidDALProvider dalProvider;
public AndroidDALProvider DalProvider
{
get { return (dalProvider ?? (dalProvider = new AndroidDALProvider())); }
}
protected override void OnCreate(Bundle bundle)
{ …Run Code Online (Sandbox Code Playgroud) 我创建了非常简单的活动 TempActivity,没有内容视图,仅用于测试目的。当这个活动加载到安卓手机中时,我做了大约 40 次方向改变,我将堆文件作为 hprof 并导出到 MAT 工具并进行检查。它显示了我的 TempActivity 的 40 个实例,在每个实例中都有许多用于操作栏视图的类,如线性布局、图像视图等。
每当我旋转屏幕时,DDMS 都会显示越来越多的内存添加到此应用程序的堆中,理想情况下不应该在一段时间后进行垃圾收集吗?当我强行执行 GC 时,它仍然没有被清除,并且显示堆中的内存增加。
请让我知道这是 Android 的默认行为,我们可以做些什么来删除所有以前的活动实例吗?这是内存泄漏的情况吗?因为在我的实时应用程序中(在 contentview 中有图像和其他东西),我在旋转屏幕时遇到同样的问题,每次创建新的实例活动并且堆大小不断增加。
是不是因为默认的 ActionBar imageview、linearlayout 或其他控件会自动内置每个 android 活动,对吗?
这是我的临时活动课程:
[Activity(Label = "TempAcivity", MainLauncher = true)]
public class TempAcivity : Activity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
// Create your application here
}
}
Run Code Online (Sandbox Code Playgroud)
编辑
这是我申请的清单文件和样式文件
<?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" …Run Code Online (Sandbox Code Playgroud) android garbage-collection memory-leaks screen-orientation xamarin