使用排球时,活动已经泄露了窗口
我使用从排球库中的JSONRequest,在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) {...}
}
我得到的错误是...
....
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)
任何想法, ...
我已阅读https://stackoverflow.com/a/2850597/3099185的答案,我发现它有点相关,但无法找到我的情况的解决方案
还有另一个链接可用,但我不能像这样的调用一般化,因为我的每个类都在以不同的方式处理数据!?!?? !!?
提前致谢!
写if(pd.isShowing()) { pd.hide(); }
if(pd.isShowing()) { pd.hide(); }
在onPostExecute()
并从doInBackground()
删除所有progressDialog
相关语句。
此错误是因为在AsyncTask
onPreExecute()
和onPostExecute()
在main thread
上运行, doInBackground()
在不同thread
上运行。 如果你要处理与Main Thread
另一个thread
UI
相关操作,那么你的窗口将被泄漏。
@Bhuro我在寻找类似问题的解决方案时遇到了这个问题。我设法得到了一个解决方案,但实际上使用pDialog.hide()而不是pDialog.dismiss()。 如果有其他人遇到这样的问题,请按照以下步骤初始化进度对话框;
ProgressDialog pDialog=new ProgressDialog(YourActivity.this);
然后在退出jsonRequest方法之前,使用抽象Response方法或Error方法解除它,就像它在上面的OP问题代码中一样。 我的pDialog方法是as;
private void showDialog(){
if(!pDialog.isShowing())
pDialog.show();
}
private void hideDialog(){
if(pDialog.isShowing())
pDialog.dismiss();
}
另外,我在Activity onDestroy方法中调用了dismiss方法;
@Override
public void onDestroy(){
super.onDestroy();
if(pDialog!=null){
hideDialog();
}
}
链接地址: http://www.djcxy.com/p/19931.html
上一篇: Activity has leaked window while using volley
下一篇: How to handle screen orientation change when progress dialog and background thread active?