3

Android 마켓에 앱을 게시하고 있습니다. 나는 HTC와 삼성에서 테스트를 마쳤다. 하지만 오늘은 아래에 나와있는 내 응용 프로그램에서 오류가 발생했습니다. 코드, 스택 트레이스가 난독 포함 심볼 이름을 난독 화 등이 응용 프로그램의 스택 추적에서 BadTokenException 창을 추가 할 수 없습니다.

android.view.WindowManager$BadTokenException 
Source method 
ViewRoot.setView() 

,

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:532) 
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:200) 
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:114) 
at android.view.Window$LocalWindowManager.addView(Window.java:424) 
at android.app.Dialog.show(Dialog.java:241) 
at android.app.AlertDialog$Builder.show(AlertDialog.java:810) 
at com.newtglobal.android.Trace.serverBusy(Trace.java:1041) 
at com.newtglobal.android.Trace.access$12(Trace.java:1013) 
at com.newtglobal.android.Trace$13$1.run(Trace.java:975) 
at android.os.Handler.handleCallback(Handler.java:587) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:130) 
at android.app.ActivityThread.main(ActivityThread.java:3687) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:507) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 
at dalvik.system.NativeStart.main(Native Method) 

. 응용 프로그램이 ProGuard를 사용하여 난독 화 된 경우 Android SDK 도구 r8 이상에 포함 된 "retrace"도구를 사용하여 스택 추적을 해독 할 수 있습니다. 자세한 내용은 ProGuard 문서를 참조하십시오.

무엇이 문제입니까? 이 오류를 제거하는 방법 ??? 하지만 HTC와 삼성에서 테스트를 마쳤습니다. 정상적으로 작동합니다.

답변

2

내 앱과 비슷한 문제가 있습니다. 일부 연구에서 AlertDialog (Application Context가 아님)를 만들 때 Activity Context를 사용하고 있는지 확인하고 가장 상위의 Activity를 사용하고 있는지 확인하고자합니다 (자세한 내용은 이 게시물에 대한 대답을 수락 : https://stackoverflow.com/a/4011090/202870).

0
@Override 
public void onCreate(Bundle savedInstanceState) { 
    // do all your other stuff here 

    new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      mProgressDialog = ProgressDialog.show(
       MyActvity.this.getApplicationContext(), "", 
       MyActvity.this.getString(R.string.loading), true); 

      // start time consuming background process here 
     } 
    }, 1000); // starting it in 1 second 
} 
0

"BadTokenException 창을 추가 할 수 없습니다"는 Android에서 꽤 자주 발생할 수 있습니다.

'팝업 창'또는 '대화 상자'와 같은 많은보기에는 시작할 부모보기/작업이 필요합니다. 부모보기가 아직 초기화되지 않았지만 뷰에 종속 된보기가 호출되는 경우 BadTokenException이 발생합니다.

먼저이 작업을 방지하려면 부모보기가 이미 전화 창에 연결되어 있어야합니다. 'onActivityAttached'또는 'onAttachedToWindow()'등을 사용하여 작업을 수행 할 수 있습니다. 그런 다음 하위보기를 호출하면 정상적으로 작동합니다.

액티비티 또는 상위 뷰가 이미 연결되어 있으면 getAppliationContext()가 아닌 자체 컨텍스트를 사용합니다.

Activity 클래스 자체에서 동일한 객체 (this/CLASS_NAME.이)를 전달할 수있는 경우.

내가보기에는 setView가 호출 될 때 상위 뷰를 얻지 못하는 것 같습니다. 그렇지 않으면 활동의 컨텍스트를 전달하십시오.

도움이 될만한 방법/

해피 코딩. :)