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í