Android 当应用程序导航到另一个活动时,如何删除启动屏幕的窗口背景图像(以避免内存泄漏)
在我的XamarinAndroid应用程序中,当应用程序启动时,我会显示3秒钟的初始屏幕。在这段时间里,我做了创建sqlite表的后台工作,如果登录需要,从web加载用户信息。这些任务是使用异步方式完成的 我为splashactivity指定了主题,在该主题中,我将背景指定为一个37 KB的jpeg文件,其尺寸为400*692 3秒钟后,我导航到我的startActivity,在SplashScreen活动的onDestroy中,我将另一个主题分配给背景设置为null的窗口。但是,如果我拍摄堆的快照并在MAT中进行检查,它仍然显示泄漏可疑的SplashActivity有4.4 MB(占总堆的13%)。我附上了SplashActivity和styles的代码 请让我知道如何避免泄漏Android 当应用程序导航到另一个活动时,如何删除启动屏幕的窗口背景图像(以避免内存泄漏),android,memory-leaks,xamarin,splash-screen,Android,Memory Leaks,Xamarin,Splash Screen,在我的XamarinAndroid应用程序中,当应用程序启动时,我会显示3秒钟的初始屏幕。在这段时间里,我做了创建sqlite表的后台工作,如果登录需要,从web加载用户信息。这些任务是使用异步方式完成的 我为splashactivity指定了主题,在该主题中,我将背景指定为一个37 KB的jpeg文件,其尺寸为400*692 3秒钟后,我导航到我的startActivity,在SplashScreen活动的onDestroy中,我将另一个主题分配给背景设置为null的窗口。但是,如果我拍摄堆的
[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)
{
base.OnCreate(bundle);
//Display Splash Screen for 3 Sec
AndroidDALProvider.InitializeTables();
Thread.Sleep(3000);
TablesCreated();
//Start Activity1 Activity
StartActivity(typeof(LoginActivity));
}
private void TablesCreated()
{
LoadData("283");
LoadData("284");
LoadData("248");
LoadData("249");
}
private void LoadData(string userID)
{
DalProvider.GetPatInfoWithID(userID,PatInfoLoadedFromSqlite);
}
private void PatInfoLoadedFromSqlite(PatientDemographicsDTOUI patientInfo, string patID)
{
if (patientInfo == null)
LoadDataFromInternet(patID);
}
private void LoadDataFromInternet(string userID)
{
//Check for internet connection
if (IsNetworkAvailable)
{
//set loggedinuser details for this user
try
{
ServiceProvider.GetPatDemographics(userID).ContinueWith(PatDemographicsReceived);
}
catch (Exception exception)
{
ShowMessage(ApplicationContext, exception.Message);
}
}
else
{
ShowMessage(ApplicationContext, "Network not available");
//ShowPatInfoScreen();
}
}
void PatDemographicsReceived(Task<PatientDemographicsDTO> patient)
{
if (patient != null)
{
//Fill the received data into local storage
DalProvider.AddPatInfoToStorage(patient.Result.GetUIModel(), PatInfoAddedToLocal);
}
}
private void PatInfoAddedToLocal(int obj)
{
}
protected override void OnDestroy()
{
dalProvider = null;
SetTheme(Resource.Style.Theme_SplashActivityNoBG);
base.OnDestroy();
}
}
[Activity(Theme=“@style/Theme.SplashActivity”,MainLauncher=true,NoHistory=true,ScreenOrientation=ScreenOrientation.grait)]
公共类SplashScreen:BaseActivity
{
私有AndroidDALProvider;
公共AndroidDALProvider DalProvider
{
获取{return(dalProvider???(dalProvider=newandroiddalprovider());}
}
创建时受保护的覆盖无效(捆绑包)
{
base.OnCreate(bundle);
//显示启动屏幕3秒
AndroidDALProvider.InitializeTables();
睡眠(3000);
创建表();
//开始活动1活动
StartActivity(类型(后勤活动));
}
创建的私有void表()
{
载荷数据(“283”);
载荷数据(“284”);
载荷数据(“248”);
载荷数据(“249”);
}
私有void LoadData(字符串userID)
{
DalProvider.getpatinfo-withid(userID,patinfo-loadedfromsqlite);
}
私有void patinfo从SQLite加载(PatientDemographicsDTOUI patientInfo,字符串patID)
{
if(patientInfo==null)
从互联网加载数据(patID);
}
私有void LoadDataFromInternet(字符串用户ID)
{
//检查互联网连接
如果(网络可用)
{
//设置此用户的loggedinuser详细信息
尝试
{
ServiceProvider.GetPatDemographics(userID).ContinueWith(PatDemographicsReceived);
}
捕获(异常)
{
ShowMessage(ApplicationContext,exception.Message);
}
}
其他的
{
ShowMessage(ApplicationContext,“网络不可用”);
//showPatInfo屏幕();
}
}
接收的无效患者人口统计(任务患者)
{
如果(患者!=null)
{
//将接收到的数据填入本地存储器
DalProvider.addPatInfo存储(patient.Result.GetUIModel(),patInfo AddedToLocal);
}
}
专用void patinfo addedtocolal(int-obj)
{
}
受保护的覆盖无效OnDestroy()
{
dalProvider=null;
SetTheme(Resource.Style.Theme\u SplashActivityNoBG);
base.ondestory();
}
}
这里是一个风格的启动屏幕
<style name="Theme.SplashActivity" parent="CustomHoloTheme">
<item name="android:windowBackground">@drawable/splash</item>
<item name="android:windowNoTitle">true</item>
</style>
@可牵引/飞溅
真的
这种风格我是在飞溅活动的OnDestroy中应用的
<style name="Theme.SplashActivityNoBG" parent="CustomHoloTheme">
<item name="android:windowBackground">@null</item>
<item name="android:windowNoTitle">true</item>
</style>
@空的
真的