Mam kilka z następujących wyjątków:
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)
Wyszukałem go w Google i zobaczyłem, że ma to coś wspólnego z wyskakującymi okienkami i obracaniem ekranu, ale nie ma odniesienia do mojego kodu.
Oto pytania:
- czy istnieje sposób, aby dowiedzieć się dokładnie, kiedy występuje ten problem?
- poza obróceniem ekranu, czy jest inne zdarzenie lub czynność, która wyzwala ten błąd?
- jak temu zapobiec?
View#onAttachedToWindow()
został wywołany?Odpowiedzi:
Miałem ten problem, w którym przy zmianie orientacji ekranu czynność kończyła się przed AsyncTask z zakończeniem okna dialogowego postępu.
onPause()
Wydawałem się rozwiązać ten problem, ustawiając okno dialogowe na wartość null, a następnie sprawdzając to w AsyncTask przed zamknięciem.... w moim AsyncTask:
źródło
Po walce z tym problemem w końcu znalazłem to obejście:
Czasami dobra obsługa wyjątków działa dobrze, jeśli nie było lepszego rozwiązania tego problemu.
źródło
Jeśli masz jakiś
Activity
przedmiot w pobliżu, możesz użyćisDestroyed()
metody:Jest to miłe, jeśli masz nieanonimową
AsyncTask
podklasę, której używasz w różnych miejscach.źródło
Używam niestandardowej klasy statycznej, która sprawia, że pokazuje i ukrywa okno dialogowe. ta klasa jest wykorzystywana także do innych czynności, a nie tylko do jednej czynności. Teraz problem, który opisałeś, pojawił się również i zostałem na noc, aby znaleźć rozwiązanie.
Na koniec przedstawiam Ci rozwiązanie!
jeśli chcesz pokazać lub zamknąć okno dialogowe i nie wiesz, która czynność zainicjowała okno dialogowe w celu jego dotknięcia, poniższy kod jest dla Ciebie.
źródło
Powyższe rozwiązanie nie zadziałało. Więc zrobiłem to
ProgressDialog
globalnie, a następnie dodałem to do mojej działalnościtak więc w przypadku zniszczenia aktywności, ProgressDialog również zostanie zniszczony.
źródło
Pytanie 1):
Biorąc pod uwagę, że komunikat o błędzie nie wydaje się wskazywać, która linia kodu powoduje problem, możesz go wyśledzić za pomocą punktów przerwania. Punkty przerwania wstrzymują wykonywanie programu, gdy program dotrze do określonych wierszy kodu. Dodając punkty przerwania do krytycznych lokalizacji, możesz określić, która linia kodu powoduje awarię. Na przykład, jeśli twój program ulega awarii w linii setContentView (), możesz umieścić tam punkt przerwania. Gdy program zostanie uruchomiony, zatrzyma się przed uruchomieniem tej linii. Jeśli następnie wznowienie spowoduje awarię programu przed osiągnięciem następnego punktu przerwania, wtedy wiadomo, że wiersz, który go zabił, znajdował się między dwoma punktami przerwania.
Dodawanie punktów przerwania jest łatwe, jeśli używasz Eclipse. Kliknij prawym przyciskiem myszy margines po lewej stronie kodu i wybierz opcję „Przełącz punkt przerwania”. Następnie musisz uruchomić aplikację w trybie debugowania, który to przycisk wygląda jak zielony owad obok normalnego przycisku uruchamiania. Gdy program osiągnie punkt przerwania, Eclipse przełączy się na perspektywę debugowania i pokaże linię, w której oczekuje. Aby ponownie uruchomić program, poszukaj przycisku „Wznów”, który wygląda jak zwykły przycisk „Odtwórz”, ale z pionowym paskiem po lewej stronie trójkąta.
Możesz również wypełnić swoją aplikację wpisem Log.d („Moja aplikacja”, „Tutaj znajdują się informacje, które wskazują, gdzie znajduje się wiersz dziennika”), który następnie wysyła wiadomości w oknie LogCat Eclipse. Jeśli nie możesz znaleźć tego okna, otwórz je za pomocą Window -> Show View -> Other ... -> Android -> LogCat.
Mam nadzieję, że to pomoże!
źródło
Dodałem do manifestu dla tego działania następujący tekst
źródło
zgodnie z kodem menedżera okien (link tutaj ), dzieje się tak, gdy widok, który próbujesz zaktualizować (który prawdopodobnie należy do okna dialogowego, ale nie jest konieczny) nie jest już dołączony do rzeczywistego katalogu głównego okien.
jak sugerowali inni, przed wykonaniem specjalnych operacji na oknach dialogowych należy sprawdzić stan działania.
oto odpowiadający kod, który jest przyczyną problemu (skopiowany z kodu źródłowego Androida):
źródło
Mój problem został rozwiązany przez uhlockowanie obracania ekranu na moim Androidzie, aplikacja, która sprawiała mi problem, teraz działa idealnie
źródło
Inną opcją jest nie uruchamianie zadania asynchronicznego, dopóki okno dialogowe nie zostanie dołączone do okna przez nadpisanie onAttachedToWindow () w oknie dialogowym, w ten sposób jest ono zawsze dopuszczalne.
źródło
Lub po prostu możesz dodać
co sprawi, że
ProgressDialog
nie będzie można anulowaćźródło
Dlaczego nie spróbować złapać, w ten sposób:
źródło
kiedy deklarujesz aktywność w manifeście, potrzebujesz android: configChanges = "orientacja"
przykład:
źródło