Activity has leaked window while using volley
I am using JSONRequest from volley library, in background as 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) {...}
}
And the error I am getting is ...
....
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)
Any idea, ...
I have read answer of https://stackoverflow.com/a/2850597/3099185 which I found somewhat relevant, but unable to find solution for my situation
There is also another link is available , but I can't generalize like that calls, as my each class is handling data differently !?!??!!?
Thanks, in advance!
Write if(pd.isShowing()) { pd.hide(); }
if(pd.isShowing()) { pd.hide(); }
in onPostExecute()
and remove all progressDialog
related statements from doInBackground()
.
This error is because in AsyncTask
onPreExecute()
and onPostExecute()
runs on main thread
and doInBackground()
runs on different thread
. If you will handle UI
related operations from another thread
than Main Thread
then your window will be leaked.
@Bhuro I came across this while searching for a solution to a similar problem.I managed to get a solution, the mistake is actually using pDialog.hide() instead of pDialog.dismiss(). In case anyone else encounters such a problem, initialize the Progress Dialog as below;
ProgressDialog pDialog=new ProgressDialog(YourActivity.this);
Then dismiss it in the volley Response method or Error method, before exiting the jsonRequest method, just like it is in the OP question's code above. My pDialog methods are as;
private void showDialog(){
if(!pDialog.isShowing())
pDialog.show();
}
private void hideDialog(){
if(pDialog.isShowing())
pDialog.dismiss();
}
Also, I called the dismiss method in the Activity onDestroy method;
@Override
public void onDestroy(){
super.onDestroy();
if(pDialog!=null){
hideDialog();
}
}
链接地址: http://www.djcxy.com/p/19932.html
下一篇: 使用排球时,活动已经泄露了窗口