Mi aplicación crashea al mostrar un alert dialog (Andr)

LLoid

Aquí estoy de nuevo, dando el coñazo xD. La cosa es que quiero mostrar un alert de confirmación cuando el usuario intenta borrar datos en mi aplicación, con este código:

		botonEliminar.setOnClickListener(new View.OnClickListener() {

		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			AlertDialog.Builder builder = new AlertDialog.Builder(
					getApplicationContext());
			builder.setMessage("¿Seguro que quieres eliminar?")
					.setCancelable(false)
					.setNegativeButton("Eliminar",
							new DialogInterface.OnClickListener() {
								public void onClick(DialogInterface dialog,	int id) {
									SQLiteDatabase database = gestor.getWritableDatabase();
									if (database != null) {
										database.execSQL("DELETE FROM Organizaciones WHERE nombre_org = '"
												+ name + "'");
										database.close();
									}

									Intent intent = new Intent(
											Consultar_organizacion.this,
											MainActivity.class);
									Consultar_organizacion.this
											.startActivity(intent);
								}
							});
			AlertDialog alert = builder.create();
			alert.show();
		}
	});

Pero la aplicación crashea siempre y no tengo ni idea de por qué. Por lo que sale en el Logcat tiene pinta de ser algo relacionado con "token null" (¿qué es?), pero no tengo ni idea de qué puede ser. ¿Ayuda?

Saludos

Edit: solved, donde pone new AlertDialog.Builder(getApplicationContext()); hay que pasar el parámetro de la actividad, no de la aplicación, luego sería new AlertDialog.Builder(nombre_actividad.this);

Tig

Varias cosas más

  1. No hagas operaciones de I/O en el hilo principal. Acceso a base de datos no debería estar ahí.

  2. Generalmente, usa el contexto de la actividad (http://stackoverflow.com/questions/7298731/when-to-call-activity-context-or-application-context)

  3. Mete en el onClick un dismiss del dialog, alguna vez me ha dado problemas porque se leakeaba el contexto

1 1 respuesta
LLoid

#2 Hola, ¿por qué dices que el acceso a la bbdd no debe ir ahí? Entiendo que por cuestiones de eficiencia, pero hasta ahora no he tenido problemas (y eso que estoy haciendo toda la aplicación así, a lo bruto xD)

La verdad es que si tuviera más tiempo intentaría adecentar el código, pero voy super pillao y en principio con que funcione me basta (es un trabajo fin de grado, no lo voy a mantener ni nada cuando lo termine).

Saludos.

2 respuestas
elkaoD

#3 básicamente, el principio máximo de la POO: separación de responsabilidades.

Cada objeto es responsable de una cosa y sólo una cosa.

Also: MVC.

2 1 respuesta
Tig

#3 además de lo que dice #4, en Android todas las operaciones dentro de un Activity se ejecutan en el hilo principal. Este hilo es el encargado de responder a las acciones del usuario, por lo que si metes operaciones que potencialmente pueden bloquear el hilo, la aplicación va a dejar de responder a la interacción. Si bloqueas ese hilo durante 5 segundos, la aplicación peta.

Un acceso a base de datos va a ir bien casi siempre pero, para evitar problemas, las "best practices" dicen que hay que sacar la operación del hilo principal.

http://developer.android.com/training/articles/perf-anr.html

Este artículo está un poco desfasado en las soluciones, pero la base sigue siendo válida.

3