У меня есть некоторые из следующих исключений:
java.lang.IllegalArgumentException: View not attached to window manager
at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:355)
at android.view.WindowManagerImpl.updateViewLayout(WindowManagerImpl.java:191)
at android.view.Window$LocalWindowManager.updateViewLayout(Window.java:428)
at android.app.Dialog.onWindowAttributesChanged(Dialog.java:596)
at android.view.Window.setDefaultWindowFormat(Window.java:1013)
at com.android.internal.policy.impl.PhoneWindow.access$700(PhoneWindow.java:86)
at com.android.internal.policy.impl.PhoneWindow$DecorView.drawableChanged(PhoneWindow.java:1951)
at com.android.internal.policy.impl.PhoneWindow$DecorView.fitSystemWindows(PhoneWindow.java:1889)
at android.view.ViewRoot.performTraversals(ViewRoot.java:727)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4338)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
at dalvik.system.NativeStart.main(Native Method)
Я погуглил и вижу, что это как-то связано со всплывающими окнами и поворотом экрана, но на мой код нет ссылки.
Вопросы следующие:
- есть ли способ узнать, когда именно возникает эта проблема?
- Есть ли другое событие или действие, вызывающее эту ошибку, кроме поворота экрана?
- как мне предотвратить это?
View#onAttachedToWindow()
как был вызван?Ответы:
У меня была эта проблема, когда при изменении ориентации экрана действие завершалось до AsyncTask с завершением диалогового окна прогресса. Я, кажется, решил это, установив диалоговое окно на null,
onPause()
а затем проверив это в AsyncTask перед тем, как закрыть.... в моей AsyncTask:
источник
После борьбы с этой проблемой я наконец нашел обходной путь:
Иногда хорошая обработка исключений работает хорошо, если для этой проблемы не было лучшего решения.
источник
Если у вас есть какой-то
Activity
объект, вы можете использоватьisDestroyed()
метод:Это хорошо, если у вас есть неанонимный
AsyncTask
подкласс, который вы используете в разных местах.источник
Я использую специальный статический класс, который показывает и скрывает диалог. этот класс используется не только для одной деятельности, но и для других видов деятельности. Проблема, которую вы описали, тоже появилась у меня, и я остался на ночь, чтобы найти решение ..
Наконец, я представляю вам решение!
если вы хотите показать или закрыть диалоговое окно и не знаете, какое действие инициировало диалоговое окно, чтобы коснуться его, то следующий код для вас.
источник
Вышеупомянутое решение не сработало для меня. Итак, я взял
ProgressDialog
глобально, а затем добавил это в свою деятельностьтак что в случае, если активность будет уничтожена, ProgressDialog также будет уничтожен.
источник
По вопросу 1):
Учитывая, что сообщение об ошибке, похоже, не говорит, какая строка вашего кода вызывает проблему, вы можете отследить ее, используя точки останова. Точки останова приостанавливают выполнение программы, когда программа переходит к определенной строке кода. Добавляя точки останова в критические места, вы можете определить, какая строка кода вызывает сбой. Например, если ваша программа дает сбой на строке setContentView (), вы можете поставить там точку останова. Когда программа запускается, она приостанавливается перед запуском этой строки. Если затем возобновление приводит к сбою программы до достижения следующей точки останова, значит, вы знаете, что строка, завершившая программу, находилась между двумя точками останова.
Добавить точки останова легко, если вы используете Eclipse. Щелкните правой кнопкой мыши поле слева от кода и выберите «Переключить точку останова». Затем вам нужно запустить приложение в режиме отладки, кнопка, которая выглядит как зеленое насекомое рядом с кнопкой обычного запуска. Когда программа достигает точки останова, Eclipse переключится на перспективу отладки и покажет вам строку, в которой она ожидает. Чтобы снова запустить программу, найдите кнопку «Возобновить», которая выглядит как обычная кнопка «Воспроизвести», но с вертикальной полосой слева от треугольника.
Вы также можете заполнить свое приложение Log.d («Мое приложение», «Здесь некоторая информация, которая сообщает вам, где находится строка журнала»), который затем отправляет сообщения в окно LogCat Eclipse. Если вы не можете найти это окно, откройте его с помощью Window -> Show View -> Other ... -> Android -> LogCat.
Надеюсь, это поможет!
источник
Я добавил в манифест этого действия следующее:
источник
по коду windowManager (ссылка здесь ), это происходит, когда представление, которое вы пытаетесь обновить (которое, вероятно, принадлежит диалогу, но не обязательно), больше не привязано к реальному корню окон.
как предлагали другие, вы должны проверить статус активности перед выполнением специальных операций с вашими диалоговыми окнами.
вот соответствующий код, который является причиной проблемы (скопирован из исходного кода Android):
источник
Моя проблема была решена путем блокировки поворота экрана на моем Android, приложение, которое вызывало у меня проблему, теперь работает отлично
источник
Другой вариант - не запускать асинхронную задачу до тех пор, пока диалоговое окно не будет прикреплено к окну, переопределив onAttachedToWindow () в диалоговом окне, таким образом, это всегда будет запрещено.
источник
Или просто вы можете добавить
что сделает
ProgressDialog
невозможным отменуисточник
Почему бы не попробовать поймать вот так:
источник
когда вы объявляете активность в манифесте, вам нужен android: configChanges = "Ориентация"
пример:
источник