탐구: 당신은 정말 안드로이드의 Dialog를 사용할 수 있습니까?

2221 단어 androiddialog
버그가 나오기 며칠 전에 이런 버그가 나왔습니다. Runtime Exception입니다. 상세한 정보는 다음과 같습니다

java.lang.IllegalArgumentException: View not attached to window manager
    at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:356)
    at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:201)
    at android.view.Window$LocalWindowManager.removeView(Window.java:400)
    at android.app.Dialog.dismissDialog(Dialog.java:268)
    at android.app.Dialog.access$000(Dialog.java:69)
    at android.app.Dialog$1.run(Dialog.java:103)
    at android.app.Dialog.dismiss(Dialog.java:252)
    at xxx.onPostExecute(xxx$1.java:xxx)
우선 Google에서 이를 일으키는 원인이 기본적으로 모두 일치하는 것이 Dismiss 대화상자일 때 Activity는 더 이상 존재하지 않는다는 것을 발견했다.이런 Exception이 자주 발생하는 상황은 시간이 걸리는 루틴 작업이 있기 때문에 Progress Dialog를 표시하고 작업이 시작될 때 대화상자를 표시한 다음에 작업이 완료되면 다시 Dismiss 대화상자를 표시해야 한다. 만약에 그 동안 Activity가 어떤 원인 때문에 죽었다가 다시 시작한다면 Dismiss를 표시할 때 Windows Manager 검사에서 Dialog가 속한 Activity가 존재하지 않는 것을 발견한다.그래서 IllegalArgumentException:View는 윈도우 관리자에 연결되지 않습니다.사실 이런 Exception의 중요한 원인 중 하나는 ProgressDialog의 창설 디스플레이와 취소가 모두 UI 라인이 아닌 프로세스에서 허용되기 때문이다.Android에서 비 UI 스레드는 UI와 관련된 작업을 할 수 없습니다. 예를 들어 View 제거 등을 추가하는 것은 허용되지 않지만, 표시와 취소 대화상자를 만들 수 있도록 허용합니까?그리고 이 Exception으로 인해 응용 Crash가 발생할 수도 있습니다.이러한 Exception을 피하려면 대화상자를 정확하게 사용하고 라인을 정확하게 사용해야 합니다.대화 상자를 올바르게 사용하려면 UI가 아닌 스레드에서 대화 상자를 만들거나 표시하거나 취소하지 마십시오.그러면 비동기 동작에 대화상자를 표시하는 것은 어떻게 합니까?Activity에는 onCreateDialog (), showDialog (), dimissDialog (), removeDialog () 등 상응하는 조작 대화상자의 리셋이 있습니다.이것들은 모두 Activity의 방법이기 때문에 사용하기가 더욱 편리하고 Dialog 대상을 만들고 조종하는 것을 표시하지 않아도 되며 모든 것은 프레임에 의해 조종되기 때문에 상대적으로 안전하다.또한 대화상자 대상을 Activity의 제어 가능한 범위 안과 생명 주기 안에 두어야 한다. 예를 들어 반드시 구성원 변수이고 대화상자 변수를 Activity의 onCreate () 와 onDestroy () 사이에서 활성화시켜야 한다.정확한 스레드를 사용하려면 단독 스레드를 최대한 적게 사용해야 한다. 진정으로 시간이 걸려야 스레드를 사용하지 않으면 스레드도 자바식의 익명 스레드를 직접 사용하지 마라. 단순한 조작이 아니라면 조작이 끝난 후에 다른 일을 할 필요가 없다.가능한 한 안드로이드에서 제공하는 클래스, 예를 들면 AsyncTask 등을 많이 사용하세요.또한 스레드 조작 과정에서 메인 스레드와 상호작용을 해야 한다면 하나의 스레드의 대상을 저장하고 스레드 내부에 일정한 제어가 있어야 액티비티가 더욱 잘 스레드를 조작할 수 있다.네트워크에서 데이터를 얻거나 백그라운드에서 파일을 읽거나 가져오기/내보내기, 복구/백업하는 등 시간이 많이 걸리고 일상적인 작업이라면 백그라운드 서비스에 넣고 StatusBar에서 진도를 내는 것이 가장 좋다.

좋은 웹페이지 즐겨찾기