2015-07-10 6 views
1

Когда я отлаживал свое приложение с помощью AndroidDeviceMonitor, я обнаружил, что куча моего приложения была странной. После запуска приложения (SplashActivity -> MainActivity), «1-байтовый массив» был выделен 42 МБ. Я был уверен, что 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-байтовый массив» был уменьшен до 35 МБ. Итак, я думаю, проблема заключается в том, что ресурсы изображения не были переработаны. Может ли кто-нибудь рассказать мне больше о деталях первой запущенной деятельности. Почему он не освобождает эти ресурсы?

+0

Могу ли я увидеть намерение, которое вы используете для запуска MainActivity? – Eoin

+0

Цель намерения = новое намерение (это, MainActivity.class); intent.setFlags (Intent.FLAG_ACTIVITY_CLEAR_TASK \t \t \t \t \t \t | Intent.FLAG_ACTIVITY_NEW_TASK); this.startActivity (намерение); this.finish(); также попытался удалить эти флаги, получил тот же результат @ Modge –

+0

, когда вы нажмете кнопку «Назад» в своем основном действии, заставка исчезла? – Eoin

ответ

0

Что вы можете сделать, чтобы удостовериться, что imge-изображение освобождено для сбора мусора, установлено, что изображение равно null в onStop, чтобы убедиться, что на нем нет ссылки.

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

    mImageView.setImageDrawable(null); 
} 

Вы можете использовать AndroidDeviceMonitor, чтобы заставить сборку мусора, чтобы убедиться, что он освобождается от кучи.

+0

да, я пробовал это. Он действительно освобожден от кучи. Но мне это интересно. Почему эта память не освобождается после того, как я закончил SplashActivity.Should мне всегда нужно делать, как 'mImageView.setImageDrawable (null);'? –

+0

Это может быть ряд причин. SplashActivity действительно не закончил, или вы используете изображение где-то еще в своем приложении, которое ссылается на него. – Eoin

+0

Также с сборкой мусора java она не очищает память все время. Это вызовет только в том случае, если JVM считает, что ему нужна сборка мусора, основанная на размере кучи Java. Подробнее: http://javarevisited.blogspot.com/2011/04/garbage-collection-in-java.html#ixzz3fTEn3RhT – Eoin

Смежные вопросы