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:
- Android: ejecución de pruebas instrumentadas en el servidor de TeamCity
- ¿Cómo puedo obtener identificadores, nombres o rutas x para elementos ui utilizados en una aplicación para móviles (Android / iOS) para pruebas de automatización móvil?
- Cómo detener y reiniciar una actividad en una prueba de instrumentación de Android?
- ClassNotFoundException durante el instrumento de prueba de Android
- Destruye y reinicia la actividad con la biblioteca de soporte de pruebas
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?
- Android en la aplicación de facturación sandbox
- Cómo detener una aplicación de Android desde la consola
- Prueba de suscripción en Android: elemento no encontrado
- Prueba de unidad automatizada para Android / Ant
- Prueba de un servicio de accesibilidad de Android?
- Prueba de Android fuera del espacio de almacenamiento
- Prueba de un ContentProvider personalizado en Android
- Java.lang.RuntimeException: ¡Stub! - ¿Cobertura de código de Android?
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(); } });
- ¿Por qué dibujar bitmaps es muy lento en algunos teléfonos Android 2.2?
- Escapar% en las preferencias de ICS – ¿Realmente tengo que escribir la manipulación de versiones específicas de la cadena?