2010-12-06 2 views
4

일부 장치에 - 나는 두 개의 스택 추적, 예를 들어, 그들 중 하나있어 :안드로이드 : 두 개의 오류 만 가끔/앱에서 추락 난 그냥 구글 마켓 플레이스 내 첫 번째 응용 프로그램을 발표하고 정보를받지

android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running? 
    at android.view.ViewRoot.setView(ViewRoot.java:468) 
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
    at android.view.Window$LocalWindowManager.addView(Window.java:424) 
    at android.app.Dialog.show(Dialog.java:239) 
    at abc.de.f.MyTask.onPreExecute(MyTask.java:52) 

을 MyTask에서 onPreExecute() 메서드를 사용할 수있는 유일한 방법은 있으며 에뮬레이터 나 물리적 장치에서 충돌하지 않습니다. 그러나 때로는 "야생에서 빠져 나가는 것"으로 보인다.

귀하의 첫 번째 조치는 이유가 무엇입니까?

고마워,

스테판

편집 :

작동하지만 쇼가()하지 않는 this.dialog.setMessage
@Override 
protected void onPreExecute() { 
    this.dialog.setMessage(((Activity) listener).getString(R.string.daten_werden_geladen)); 
    this.dialog.show(); 
} 

... :(

답변

5

외모 UI를 업데이트하거나 닫힌 액티비티의 컨텍스트를 사용하여 onPreExecute() 대화 상자를 표시하는 것과 같습니다. 작업 구현에 논리적 실수가있는 것 같습니다. 컨텍스트를 사용하여 UI를 업데이트하거나 u에서 액티비티의 뷰에 대한 참조를 보유하고있는 경우에 ctivity가 실행 중입니다.

EDIT : 문자열 리소스를 가져 오는 데 Activity의 컨텍스트를 사용하는 대신 응용 프로그램의 컨텍스트를 사용해보십시오.

this.dialog.setMessage(((Activity) listener).getApplicationContext().getString(R.string.daten_werden_geladen)); 
+0

안녕하세요, Varun, 답장을 보내 주셔서 감사합니다. 그러나 왜 때로는 충돌 만하는 것 같습니까? 슬픈 것처럼 거기에 갈 수있는 유일한 가능성이 있습니다. 거기에 많은 테스터가 있고 항상 작동합니다. 그럼에도 불구하고 스택 추적과 함께 오류 메시지가 나타납니다 ... – swalkner

+0

u가 작업에서 http 연결을 만들고 있고 가끔 연결을 설정하는 데 더 많은 시간이 걸릴 수도 있습니다. 또한 u가 작업의 컨텍스트 개체에 대한 참조를 보유하고 있으면 현재 컨텍스트로 컨텍스트 개체를 업데이트 할 수 있습니다. – Varun

+0

하지만 onPreExecute 메서드에서 오류가 발생하면 HTTP 연결이 나중에 설정됩니다. doInBackground ... :( – swalkner

0

그것은 당신의 활동이 아직 실행 (또는 이미 이전에 언급 한 바와 같이 사라)되지 않는다는 것을 나에게 보인다

그것은 스레드를 실행하고 또한 애플리케이션의 라이프 사이클이 정확히되지 방법에 따라 달라질 수 있습니다

모든 안드로이드 버전에서 동일하게, 적어도 에뮬레이터에서 1.6, 2.1 & 2.2로 복제하려고합니다. 또한 시장 보고서는 특정 장치에서만 발생하는 경우 알려줍니다.

일부 제조업체 변경 사항이 활동주기가 수행되는 방식에 영향을 주었더라도 나는 놀라지 않을 것입니다. 적어도 HTC Sense 장치와 일부 LG, Samsung 또는 Motorola에서는 모두 Android UI 위에 UI 조정 기능이 있으므로이 기능을 확인하려고합니다.

하나의 가능한 솔루션 (해킹 만하고 문제를 해결하지 못함)은 postDelayed를 사용하여 해당 코드의 실행을 지연시키는 것입니다. 그러면 몇 밀리 초 후에 UI 스레드로 이동합니다. 내가 말했듯이 문제의 근원을 공격하지는 않을 것이지만 그것이 사라지게 할 수도 있습니다.

0

swalkner, 당신이 앱에서 .Check을 구성 변경을 돌볼 필요가 보인다 this

0
, 우리가보기를 추가 할 수 있습니다 Context.because에만 활동을 얻기 위해 활동을 사용해야합니다 우리는 컨텍스트를 얻을 수 getApplicationContext()을 사용할 수 없습니다

관련 문제