volley example asynctask android android-asynctask android-volley

asynctask - volley android example



La actividad ha filtrado la ventana mientras usa volea (2)

Estoy usando JSONRequest desde la biblioteca de volley, en segundo plano como Asynctask () ...

public class DataTask extends AsyncTask<String, Void, Void> { public static ProgressDialog pd; ... public DataTask(Context ctx,...) { ... pd = new ProgressDialog(context); ... } @Override protected void onPreExecute() { super.onPreExecute(); pd.setTitle("Please wait..."); pd.show(); } @Override protected Void doInBackground(String... params) { ... Log.d(TAG, " url=" + url); JSONRequest jsonObjReq = new JSONRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { ... if (response.equals("success")) { ... }else if(response.equals("fail")){ // logout the user and redirect to login screen } Log.d(TAG, " -> pd.isShowing() = " + pd.isShowing()); if (pd.isShowing()) { pd.hide(); } ... } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { error.printStackTrace(); pd.hide(); } }); ... // Adding request to request queue App.Instance().addToQueue(jsonObjReq); return null; } @Override protected void onPostExecute(Void data) {...} }

Y el error que estoy recibiendo es ...

.... E/WindowManager: android.view.WindowLeaked: Activity com.volley.exmpl.DataViewActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{3d416b1c V.E..... R......D 0,0-729,324} that was originally added here at android.view.ViewRootImpl.<init>(ViewRootImpl.java:363) at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:271) at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85) at android.app.Dialog.show(Dialog.java:298) at com.volley.exmpl.Task.LoginTask.onPreExecute(LoginTask.java:43) at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:591) at android.os.AsyncTask.execute(AsyncTask.java:539) at com.volley.exmpl.DataViewActivity.callLogin(DataViewActivity.java:281) at com.volley.exmpl.DataViewActivity.ondataViewCompleted(DataViewActivity.java:283) at com.volley.exmpl.Task.DataTask$1.onResponse(DataTask.java:210) at com.volley.exmpl.Task.DataTask$1.onResponse(DataTask.java:112) at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:68) at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:113) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5254) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) D/TAG_Act: onStop()-> className::close ListActivity D/AndroidRuntime: Shutting down VM .... --------- beginning of crash E/AndroidRuntime: FATAL EXCEPTION: main Process: com.volley.exmpl, PID: 29825 java.lang.IllegalArgumentException: View=com.android.internal.policy.impl.PhoneWindow$DecorView{3d416b1c V.E..... R......D 0,0-729,324} not attached to window manager at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:396) at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:322) at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:116) at android.app.Dialog.dismissDialog(Dialog.java:341) at android.app.Dialog.dismiss(Dialog.java:324) at com.volley.exmpl.Task.LoginTask$1.onResponse(LoginTask.java:120) at com.volley.exmpl.Task.LoginTask$1.onResponse(LoginTask.java:71) at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:68) at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:113) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5254) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

Alguna idea, ...

He leído la respuesta de https://stackoverflow.com/a/2850597/3099185 que encontré algo relevante, pero no puedo encontrar una solución para mi situación

También hay otro enlace disponible , pero no puedo generalizar de esa manera, ¡ya que cada clase maneja los datos de manera diferente!?! ?? !!?

¡Gracias por adelantado!


@Bhuro Me encontré con esto mientras buscaba una solución a un problema similar. Pude obtener una solución, el error es usar pDialog.hide () en lugar de pDialog.dismiss (). En caso de que alguien más encuentre tal problema, inicialice el cuadro de diálogo de progreso como se muestra a continuación;

ProgressDialog pDialog=new ProgressDialog(YourActivity.this);

Luego deséchelo en el método de Respuesta de volea o el método de Error, antes de salir del método jsonRequest, tal como está en el código de la pregunta OP arriba. Mis métodos pDialog son como;

private void showDialog(){ if(!pDialog.isShowing()) pDialog.show(); } private void hideDialog(){ if(pDialog.isShowing()) pDialog.dismiss(); }

Además, llamé al método de descarte en el método Activity onDestroy;

@Override public void onDestroy(){ super.onDestroy(); if(pDialog!=null){ hideDialog(); } }


Escriba if(pd.isShowing()) { pd.hide(); } if(pd.isShowing()) { pd.hide(); } en onPostExecute() y elimine todas las sentencias relacionadas con progressDialog de doInBackground() .

Este error se debe a que en AsyncTask onPreExecute() y onPostExecute() ejecuta en el main thread y doInBackground() ejecuta en un thread diferente. Si va a manejar las operaciones relacionadas con la UI desde otra thread que no sea Main Thread , su ventana se filtrará.