2016-07-19 13 views
2

Ich habe ein System von 2 lächerlich einfache Activity-Objekte - MainActivity startet TestActivity, die ein sehr großes Bild darauf hat. Wenn ich in TestActivity bin, drücke ich den Zurück-Knopf und gehe zurück zu MainActivity, aber mein Speicher (ca. 45-50m) wird nicht erkannt. Irgendwelche Ideen?Android-Aktivität Leck in sehr einfacher Einrichtung

Leak

enter image description here

MainActivity.java

  public class MainActivity extends Activity { 

      @Override 
      protected void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.activity_main); 

       Intent intent = new Intent(this, TestActivity.class); 
       startActivity(intent); 
      } 
     } 

TestActivity.java

public class TestActivity extends Activity { 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_test); 
     } 


     @Override 
     public void onBackPressed() { 
      super.onBackPressed(); 
     } 


    } 

MainActivity Layout

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.leaked.leaked.MainActivity"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Hello World!" /> 
    </RelativeLayout> 

TestActivity Layout

<?xml version="1.0" encoding="utf-8"?> 
    <FrameLayout android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_centerVertical="true" 
     android:layout_centerHorizontal="true" 
     xmlns:android="http://schemas.android.com/apk/res/android"> 

     <ImageView 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:src="@drawable/earth_poster_large"/> 
    </FrameLayout> 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.leaked.leaked"> 

    <application> 
     <activity 
      android:name=".MainActivity" 
      android:screenOrientation="portrait"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
     </activity> 
     <activity android:name=".TestActivity"> 
     </activity> 
    </application> 

</manifest> 
+0

Ist es wirklich ein Speicherleck? –

+0

Sieht aus wie es ist. Hat einen Heapspeicherauszug erstellt und in Android Studio analysiert. Bild zum Fragetext hinzugefügt. Plus, es ist wirklich nicht Müll sammeln, dass große Stück Speicher (ich verwendete speziell ein sehr großes Bild im Layout von TestActivity) –

Antwort

0

Sie sollen den von den ImageView belegten Speicher freigeben, wenn Sie nicht mehr benötigen. In Ihrem Fall können Sie tun, dass dies in TestActivity der onDestroy() mit -

yourImageView.setImageDrawable(null); 
+0

Ok. Tat dies. Hinzugefügt: '((ImageView) findViewById (R.id.huge_image)). SetImageDrawable (null);' Es hat sicherlich den zugewiesenen Speicher übertroffen. Die Aktivität wird jedoch weiterhin unter dem Dropdown-Menü "Durchgesickert" des Heap-Dump-Analysators in Android Studio angezeigt. –

+0

Ich habe das riesige Bild hinzugefügt, um schnell sehen zu können, dass der Speicher belegt ist. Davor hatte ich kein Bild - die TestActivity war auch damals noch undicht. –

0

Eine Sache, die Sie destroy die activity von finish() manuell aufrufen tun können.

Es ist jedoch immer noch nicht garantiert, dass der Speicher nicht belegt ist.

+0

Hm. Ich hatte den Eindruck, dass sobald onDestroy() aufgerufen wird, und es keine Speicherlecks gibt (wie ein statischer Kontext oder eine ähnliche Statistik), wird die Aktivität als Müll gesammelt. –

0

Ich denke, es gibt wirklich kein Leck. Wenn ich versuche, große Testaktivitäten zu starten, werden die "ausgelaufenen Aktivitäten" erfolgreich angezeigt. Ich nehme an, dass die Android-Laufzeitumgebung diese Aktivitäten aus Leistungsgründen nicht sofort aktiviert, d. H. Der Benutzer wird sie vielleicht in Zukunft wieder aufrufen. Und nur wenn genügend lange Zeit verstrichen ist, wird es diese streunenden Aktivitäten tun.