Android: actividad ha filtrado ventana debido al diálogo de progreso?

Estoy desarrollando mi primera aplicación de Android y quiero mostrar el diálogo de progreso mientras el usuario hace clic en el botón de inicio de sesión en mis aplicaciones. Así que integré asynctask en las aplicaciones, todas las operaciones como logout logout hecho con éxito, pero el problema es que después de iniciar sesión con éxito esto me da error como LoginActivity ha filtrado ventana debido al diálogo de progreso. Cómo descartar el diálogo de progreso y actualizar la interfaz de usuario.

Por favor refiérase al siguiente código y dígame algunos cambios

Siguiente es el LoginActivity

public class LoginActivity extends SherlockActivity { ................. @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); sessionmngr = new SessionManager(this); //check the user login or not if (sessionmngr.isLoggedIn()) { Intent checkLoginIntnt = new Intent(this,ProjectFragActivity.class); startActivity(checkLoginIntnt); } setContentView(R.layout.activity_login); ........ } // onclick listener when click on login activity public void LoginToBookingScape(View v) throws JSONException { username = edtTxtUserName.getText().toString(); userpsw = edtTxtUserPsw.getText().toString(); if ((username.trim().length() > 0)&&(userpsw.trim().length() > 0)) { JsonWebService jsonWebs = new JsonWebService(); jsonWebs.execute(loginUrl); }else { ............ } } 

A continuación se muestra la clase interna para extender AsyncTask en LoginActivity

 private class JsonWebService extends AsyncTask<String,Void,String> { private ProgressDialog dialogLogin; @Override protected String doInBackground(String... url) { httpPost.setEntity(new UrlEncodedFormEntity(params)); .... inStream = httpEntity.getContent(); ......... return jsonResp; } @Override protected void onPostExecute(String jsonData) { //get string data from doinBackground try { JSONObject jsonObj = new JSONObject(jsonData); String key_login = jsonObj.getString(KEY_LOGIN); if (key_login.equalsIgnoreCase("0")) { ............. }else { .... sessionmngr = new SessionManager(getApplicationContext()); sessionmngr.createLoginSession(id,jsonObj.getString(KEY_UNAME), jsonObj.getString(KEY_UEMAIL)); dialogLogin = ProgressDialog.show(LoginActivity.this, "Bookingscape", "Please Wait",true); dialogLogin.setIcon(R.drawable.icon); new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(4000); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); Intent inteProj = new Intent(getApplicationContext(), ProjectFragActivity.class); startActivity(inteProj); finish(); } ........ } @Override protected void onCancelled() { dialogLogin.dismiss(); dialogLogin = null; super.onCancelled(); } } 

}

Quiero hacer una pregunta aquí

Es por encima del código optimizar y reutilizables.

Gracias por adelantado

El problema es que se está moviendo a una nueva actividad sin descartar el diálogo de progreso. Esto causará error de ventana filtrada

Creo que debe mover dialogLogin.dismiss(); onCancelled() bloque onCancelled() bloque onPostExecute en su código

Usted debe hacer esto antes de que usted vaya a otra actividad. Antes de

 Intent inteProj = new Intent(getApplicationContext(),ProjectFragActivity.class); startActivity(inteProj); 

Esta línea de código. Creo que esto resolverá su problema

Una duda : ¿dónde está su onPreExecute? Por lo general, mostrar código de progreso en ese bloque y descartar que en onPostExecute

Por lo general, el flujo es como este onPreExecute-->doInBackground --->onPostExecute

EDIT:

OnPreExecute: Inicializa los componentes de tu interfaz de usuario (por ejemplo: Dialoges) .En tu caso ProgressDialog apareció

DoInBackground: Después de onPreExecute control de bloques va a este bloque esto. Aquí el ProgressDialog continúa su trabajo

OnPostExecute: el control viene aquí después de toda la acción de fondo.Aquí usted puede despedir su ProgressDialog y goto su nueva actividad.

Posiblemente es debido a que usted está escribiendo

 Intent inteProj = new Intent(getApplicationContext(), ProjectFragActivity.class); startActivity(inteProj); 

Antes de descartar el diálogo, significa que su diálogo sigue mostrando el proceso, incluso su actividad ha cambiado. Tan solo pon tu

 dialogLogin.dismiss(); dialogLogin = null; 

Líneas antes de esto

 Intent inteProj = new Intent(getApplicationContext(), ProjectFragActivity.class); startActivity(inteProj); 

Entonces este problema será resuelto.

Tuve este problema también y esto es lo que causó. Mi aplicación toma entradas y las agrega a la base de datos SQLite. Esto es lo que yo tenía:

  public Item doInBackground(String...params) { Item item = new Item(); try { item.setItemName(params[0]); item.setSupplierPhone(params[1]); ... databaseHandler.addItem(item); //Toast.makeText(mContext, "Item successfully saved.", Toast.LENGTH_SHORT).show(); databaseHandler.close(); } catch (SQLiteException e) { Toast.makeText(mContext, "Error saving Item!", Toast.LENGTH_SHORT).show(); } return item; } 

Creo que esto fue porque estaba tratando de mostrar un onPostExecute() diálogo después de la ruta de ejecución ya estaba en onPostExecute()

También es importante tener en cuenta que hay muchas razones por las que se lanza esta excepción. Muchos de ellos se discuten aquí

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.