我正在使用 ACRA 报告应用程序崩溃。我收到一条错误消息,并认为我已经通过将if 语句View not attached to window manager包装起来修复了它:pDialog.dismiss();
View not attached to window manager
pDialog.dismiss();
if (pDialog!=null) { if (pDialog.isShowing()) { pDialog.dismiss(); } }
它减少了View not attached to window manager我收到的崩溃次数,但我仍然遇到一些,我不知道如何解决它。
错误信息:
java.lang.IllegalArgumentException: View not attached to window manager at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:425) at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:327) at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:83) at android.app.Dialog.dismissDialog(Dialog.java:330) at android.app.Dialog.dismiss(Dialog.java:312) at com.package.class$LoadAllProducts.onPostExecute(class.java:624) at com.package.class$LoadAllProducts.onPostExecute(class.java:1) at android.os.AsyncTask.finish(AsyncTask.java:631) at android.os.AsyncTask.access$600(AsyncTask.java:177) at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:176) at android.app.ActivityThread.main(ActivityThread.java:5419) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:525) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862) at dalvik.system.NativeStart.main(Native Method)
代码片段:
class LoadAllProducts extends AsyncTask<String, String, String> { /** * Before starting background thread Show Progress Dialog * */ @Override protected void onPreExecute() { super.onPreExecute(); pDialog = new ProgressDialog(CLASS.this); pDialog.setMessage("Loading. Please wait..."); pDialog.setIndeterminate(false); pDialog.setCancelable(false); pDialog.show(); } /** * getting All products from url * */ protected String doInBackground(String... args) { // Building Parameters doMoreStuff("internet"); return null; } /** * After completing background task Dismiss the progress dialog * **/ protected void onPostExecute(String file_url) { // dismiss the dialog after getting all products if (pDialog!=null) { if (pDialog.isShowing()) { pDialog.dismiss(); //This is line 624! } } something(note); } }
显现:
<activity android:name="pagename.CLASS" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout" android:label="@string/name" > </activity>
我缺少什么来阻止这种崩溃的发生?
如何重现错误:
Settings -> Developer Options -> Don't keep Activities
AsyncTask
ProgressDialog
Android 操作系统会在活动被隐藏后立即销毁它。当onPostExecute被调用时,Activity将处于 “完成” 状态并且ProgressDialog将不附加到Activity.
onPostExecute
Activity
如何修复它:
onDestroy
android.view.WindowLeaked
试试这个固定代码:
public class YourActivity extends Activity { private void showProgressDialog() { if (pDialog == null) { pDialog = new ProgressDialog(StartActivity.this); pDialog.setMessage("Loading. Please wait..."); pDialog.setIndeterminate(false); pDialog.setCancelable(false); } pDialog.show(); } private void dismissProgressDialog() { if (pDialog != null && pDialog.isShowing()) { pDialog.dismiss(); } } @Override protected void onDestroy() { dismissProgressDialog(); super.onDestroy(); } class LoadAllProducts extends AsyncTask<String, String, String> { // Before starting background thread Show Progress Dialog @Override protected void onPreExecute() { showProgressDialog(); } //getting All products from url protected String doInBackground(String... args) { doMoreStuff("internet"); return null; } // After completing background task Dismiss the progress dialog protected void onPostExecute(String file_url) { if (YourActivity.this.isDestroyed()) { // or call isFinishing() if min sdk version < 17 return; } dismissProgressDialog(); something(note); } } }