Prueba de pérdidas de memoria en las aplicaciones de Android

Recientemente he aprendido cuánta memoria se puede desperdiciar por el contexto de fugas y cómo probar tales fugas con un volcado de memoria después de un cambio de orientación de pantalla. La nueva actividad debe ser instanciada y creada, el original destruido y recogido. Sin embargo, a menos que esté perdiendo memoria y no la vea, la actividad siguiente no parece ser recogida si comienza una actividad diferente y se destruye a sí misma:

public class Foo extends Activity { private Button button; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); button = new Button(this); button.setOnClickListener(new OnClickListener() { public void onClick(View view) { startActivity(new Intent(Foo.this, Bar.class)); finish(); } }); setContentView(button); } protected void onDestroy() { super.onDestroy(); button.setOnClickListener(null); Log.e("you're it", "isFinishing() == " + isFinishing()); } } 

 public class Bar extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView textView = new TextView(this); textView.setText("hello, world"); setContentView(textView); } } 

Aquí está la información de volcado de memoria, tomada después de hacer clic en el botón para iniciar Bar y solicitar recolección de basura unas cuantas veces:

 Class Name | Shallow Heap | Retained Heap ---------------------------------------------------------------------------------------- com.test.testProject.Foo @ 0x4135b188 | 184 | 2,208 mOuterContext android.app.ContextImpl @ 0x4135b390 | 96 | 392 <Java Local> java.lang.Thread @ 0x40996460 main Thread| 80 | 1,416 mContext android.media.AudioManager @ 0x4135b480 | 48 | 176 ---------------------------------------------------------------------------------------- 

Basándome en esto , pensé que lanzar un acabado extra entre las actividades haría que el primer elegible para la recolección y me permita probar por fugas de una manera adicional, ¿es esto razonable? ¿Tengo fugas de memoria? ¿Hay alguna razón por la que Android desearía mantener esta actividad destruida alrededor?

Quizás u puede intentar el código como abajo:

  button.setOnClickListener(new OnClickListener() { public void onClick(View view) { startActivity(new Intent(getApplicationContext(), Bar.class)); finish(); } }); 
  • Java y la metodología de prueba de Android
  • Espresso prueba pegado / inactivo después de realizar (haga clic ()) en el botón en ViewAnimator
  • ¿Cómo puedo ejecutar una sola prueba con gradle android
  • ¿Cómo crear sombras personalizadas en robolectric 3.0?
  • Optimizar el esfuerzo de prueba de Android
  • IsolatedContext vs AndroidTestCase.getContext ()
  • ¿Por qué no hay instrumentación de prueba para BroadcastReceiver?
  • Prueba de AdMob antes de publicar
  • Android: ¿Cómo puedo guardar, borrar y restaurar SharedPreferences para la prueba de unidades?
  • ¿Hay un comando ADB para habilitar / deshabilitar datos móviles? (Dispositivo enraizado)
  • ¿Cómo probar la función de sincronización de ejecución en android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.