Finalizar la actividad desde la vista personalizada utilizando el contexto

Aquí está mi código:

private void makeDialog2() { AlertDialog.Builder about = new AlertDialog.Builder(getContext()); about.setTitle("You Won!"); about.setPositiveButton("Play Again", new DialogInterface.OnClickListener() { public void onClick(DialogInterface arg0, int arg1) { Intent playIntent2 = new Intent(getContext(), PracticePlayActivity.class); playIntent2.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); getContext().startActivity(playIntent2); ((Activity) getContext()).finish(); } }); about.setNegativeButton("Exit", new DialogInterface.OnClickListener() { public void onClick(DialogInterface arg1, int arg2) { Intent playIntent = new Intent(getContext(), PlayChooserActivity.class); playIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); getContext().startActivity(playIntent); ((Activity) getContext()).finish(); } }); about.show(); } 

Este código se solicita cuando el usuario pierde el juego y desea volver a intentarlo. Sin embargo, cuando presiono reintento más de 4 veces la aplicación se bloquea. Estoy sospechando una fuga de memoria. Después de algunas pruebas en logcat logré averiguar que la actividad sigue funcionando después de volver a intentarlo.

Mi plan es atacar este problema con dos cosas. Reciclando mis dibujos y terminando la primera actividad como un todo. Sin embargo, la primera actividad no se cierra incluso después de que llame al final. ¿Alguna ayuda? (Usar getContext () en otras partes de mi código ha funcionado hasta ahora).

EDIT: Al terminar la actividad destruye automáticamente las variables? O ¿todavía necesito borrar los mapas de bits de la memoria de Android? ¿Alguna idea de cómo puedo hacer esto?

Si makeDialog2() se declara dentro de una Activity intente usar this o YourActivityName.this lugar de getContext() . Si no es así, intente pasar el Context al método como un parámetro usando this o YourActivityName.this desde donde llama al método.

Al terminar la actividad destruye automáticamente las variables?

Finalizar una Activity debe destruirla y todos los recursos relacionados. Si inicia una nueva instancia de la Activity más adelante, volverá a crear todos sus recursos. A menos que utilice algún tipo de variables estáticas, permanecerán "vivas" siempre y cuando su aplicación esté en ejecución.


El lugar donde se llama este método es en realidad la vista de la superficie, por lo tanto, cualquier parámetro que le dé será esencialmente todavía getContext (). ¿Hay alguna forma de evitar esto? No veo por qué ((Actividad) getContext ()). Finish (); No esta funcionando

Echa un vistazo a la documentación de la clase de Activity .

Como se puede ver, Context es una superclase de Activity , lo que significa que cada Activity es un Context pero no todo Context es una Activity . En otras palabras ((Activity) getContext()).finish(); Puede provocar una ClassCastException .

Lo que usted podría hacer para verificar que el Context que obtiene es de hecho también una Activity es hacer un cheque como este:

 if( getContext() instanceof Activity ) Log.e( "TAG", "getContext() returns an Activity!" ); 

Agregue ese derecho antes de que usted llame a finish() y compruebe si LogCat acepta que es una Activity .

Lo solucioné. Tal vez es un error, pero tuve que llamar primero al nombre de la clase antes de la función getContext (). Tal vez es un error con la función de diálogo o un error en mi estructura de código.

 ClassName.this.getContext() 

Me las arreglé para encontrar una solución a este problema y evitar que ClassCastException.

En primer lugar, anule el método getApplicationContext () en su actividad para que devuelva la instancia actual

 @Override public Context getApplicationContext() { return this; } 

Este método todavía devolverá la instancia con un tipo de referencia Context, pero ahora puede convertirlo en YourActivity antes de pasarlo a su vista personalizada.

  new CustomView((YourActivity) getApplicationContext()); 

Además, asegúrese de hacer referencia a esto con YourActivity lugar de Context en su vista personalizada.

Espero que este post ayuda a cualquier otra persona que se encuentra con esto 🙂

  • Creación de un detector Lint Java personalizado
  • ¿Cómo puedo obtener el nombre de host o el nombre de dispositivo de dispositivos conectados a mi LAN a través de android?
  • Java Java crea mapa de bits a partir del valor hexadecimal
  • Una manera más rápida o más limpia de averiguar si un paquete está instalado en Android
  • El recurso colors.xml no funciona
  • CreateNewFile - open failed: ENOENT (ningún archivo o directorio de este tipo)
  • La generación de Gradle no pudo resolver la dependencia de la biblioteca aar (trnql sdk)
  • Android: Cómo abrir el teclado virtual programáticamente en Vista Emoji
  • AdMob no puede mostrar anuncios debido a configChanges
  • Android: consulta ContactsContract, necesita más cadena de selección avanzada
  • Adjuntar TextView a RecyclerView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.