창을 추가 할 수 없습니다. android.os.BinderProxy 토큰이 유효하지 않습니다. 활동이 실행 중입니까?


116

Facebook API를 통해 Facebook에 연결하려고합니다. 다음 예제를 따릅니다. https://github.com/facebook/facebook-android-sdk/tree/master/examples/simple

모든 것이 정상이지만 일부 코드를 편집하려고 할 때 로그인이 성공한 후 다음과 같이 대화 상자 게시 메시지를 표시하고 싶습니다.

public void onAuthSucceed() {
        mText.setText("You have logged in! ");   
        //This is the code to call the post message dialog.                     
        mFacebook.dialog(Example.this, "feed",new SampleDialogListener());   
    }

logcat에서이 오류를 수신합니다.

03-02 13:32:08.629: E/AndroidRuntime(14991): android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@405180f8 is not valid; is your activity running?
03-02 13:32:08.629: E/AndroidRuntime(14991):    at android.view.ViewRoot.setView(ViewRoot.java:532)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at android.view.Window$LocalWindowManager.addView(Window.java:424)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at android.app.Dialog.show(Dialog.java:241)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at com.facebook.android.Facebook.dialog(Facebook.java:780)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at com.facebook.android.Facebook.dialog(Facebook.java:737)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at com.facebook.android.Example$SampleAuthListener.onAuthSucceed(Example.java:113)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at com.facebook.android.SessionEvents.onLoginSuccess(SessionEvents.java:78)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at com.facebook.android.Example$LoginDialogListener.onComplete(Example.java:88)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at com.facebook.android.Facebook$1.onComplete(Facebook.java:320)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at com.facebook.android.FbDialog$FbWebViewClient.shouldOverrideUrlLoading(FbDialog.java:144)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at android.webkit.CallbackProxy.uiOverrideUrlLoading(CallbackProxy.java:218)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:337)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at android.os.Handler.dispatchMessage(Handler.java:99)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at android.os.Looper.loop(Looper.java:130)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at android.app.ActivityThread.main(ActivityThread.java:3687)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at java.lang.reflect.Method.invokeNative(Native Method)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at java.lang.reflect.Method.invoke(Method.java:507)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at dalvik.system.NativeStart.main(Native Method)

어떤 생각?



1
아래 답변을 확인하십시오. 나는 그것이 : 맞습니다 표시 한
한 트란

답을 표시했다고해서 이것이 중복 질문이라는 사실이 바뀌지는 않습니다. 다른 하나는 먼저 질문을 받았으며 본질적으로 동일한 대답을 가진 동일한 문제입니다.
bsara

1
제 질문이 2 년 전이라는 걸 봤나요?
한 트란

1
그러니 다른 중재자가 실수를했지만 당신은 :)) Anw, 감사합니다!
한 트란

답변:


127

더 이상 존재하지 않는 컨텍스트에 대한 대화 상자를 표시 할 때 발생할 수 있습니다. 일반적인 경우- '대화 상자 표시'작업이 비동기 작업 이후이고 해당 작업 중에 원래 활동 (대화 상자의 부모)이 삭제되는 경우입니다. 좋은 설명은 다음 블로그 게시물과 댓글을 참조하십시오.

http://dimitar.me/android-displaying-dialogs-from-background-threads/

위의 스택 추적에서 facebook 라이브러리가 인증 작업을 비동기 적으로 스핀 오프하는 것으로 보이며이 시나리오를 쉽게 만들 수있는 Handler-Callback 메커니즘 (onComplete가 리스너에서 호출 됨)이 있습니다.

내 앱에서보고 된 것을 보았을 때 매우 드물고 블로그 게시물의 경험과 일치합니다. 활동에 문제가 발생했거나 AsyncTask 작업 중에 파괴되었습니다. 매번 수정 사항이 어떻게 발생할 수 있는지 모르겠지만 코드가 실행될 때 항상 파괴되는 대화 상자의 컨텍스트로 Activity를 참조하고 있습니까?

또한 이것이 활동이 실행 중인지 확인하는 가장 좋은 방법인지 확실하지 않지만 수행하는 한 가지 방법에 대해서는 다음 답변을 참조하십시오.

활동이 활성 상태인지 확인


3
전화하지 않으면 dialog.show()문제가 해결되지만 내 대화를 계속 표시 할 수있는 해결 방법은 무엇입니까?
natsumiyu

나를 위해, 내가 전화하고있어 Fragment.getContext()21 위의 API를 위해 작동하지만 롤리팝에 충돌하는
TheRealChx101

158

내 앱 중 일부에서이 오류가 가끔보고되는 것을 보았는데,이 문제가 해결 된 이유는 다음과 같습니다.

if(!((Activity) context).isFinishing())
{
    //show dialog
}

다른 모든 답변은 달리기 활동 목록을 반복하는 것과 같은 이상한 일을하는 것 같지만 이것은 훨씬 간단하고 트릭을 수행하는 것 같습니다.


6
이 문제가 해결되지 않습니다, 그것은뿐만 아니라 충돌하고 보여주는 대화 상자를 방지
YTerle

6
확인해야 함을 기억하십시오. context instanceof Activity그렇지 않으면 Exception!
FtheBuilder

3
또는 당신은 getActivity ()를 사용할 수 isFinishing () 대신 컨텍스트의.
니키타 Axyonov

API-23을 사용하고 있습니다. AppCompatActivity를 확장하는 MainActivity에서 이것을 사용하려고 할 때. 원인 : java.lang.ClassCastException : com.creativeapp.hindihdvideosongs.AppController cannot be cast to android.app.Activity at com.creativeapp.hindihdvideosongs.MainActivity.onCreate (MainActivity.java:145) AppController is 내 AndroidMenifest에 추가
파벨

대화를 사용하지 않고이 오류가 발생합니다.
Abdul Waheed

11

한 가지 간단한 해결 방법은 예외를 포착하는 것입니다.

try {
        alertDialog.show()
    }
catch (WindowManager.BadTokenException e) {
        //use a log message
    }

우아하지는 않지만 비동기 작업을 관리해야하고 대화 상자를 표시 할 때 활동이 실행 중인지 여부를 확신 할 수없는 경우에는 때때로 쉽습니다.


1
너무 못 생겼지 만 너무 아름다워!
Rahul Tiwari

8
  • 제 경우에는 onPostExecuteAsyncTask 에서 대화 상자를 열거 나 표시하려고하기 때문에 문제가 발생했습니다.

  • 그러나 잘못된 방법 showing dialog또는 Ui가 onPostExecute.

  • 이를 위해 활동이 활성 상태인지 확인해야합니다. 예 : !isFinishing() 활동이 완료되지 않은 경우 대화 상자 또는 UI 변경 만 표시 할 수 있습니다.

    @Override
    protected void onPostExecute(String response_str) {
    
       getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if (!((Activity) mContext).isFinishing()) {
                            try {
                                ShowAgilDialog();
                            } catch (WindowManager.BadTokenException e) {
                                Log.e("WindowManagerBad ", e.toString());
                            }
                        }
                    }
                });
    }

1

나는 똑같은 문제에 직면했습니다. 호출 '(!isFinishing())'은 충돌을 방지했지만 '경고'메시지를 표시 할 수 없습니다.

그런 다음 경고가 표시되는 함수 'static' 호출을 시도했습니다 . 그 후에는 충돌이 발생하지 않고 메시지도 표시됩니다.

예 :

public static void connect_failure() {      
        Log.i(FW_UPD_APP, "Connect failed");

        new AlertDialog.Builder(MyActivity)
        .setTitle("Title")
        .setMessage("Message")
        .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) { 
                  //do nothing
            }
         })
        .setIcon(R.drawable.the_image).show();      
    }

1

스레드를 실행 한 후이 두 줄의 코드를 추가하면 문제가 해결됩니다.

Looper.loop();
Looper.myLooper().quit();

1

또 다른 개발자 사용 사례 다음 경우 WindowManager또는이 getWindow()호출되고 onCreate()하거나 onStart()또는 onResume()하는이 BadTokenException발생합니다. 보기가 준비되고 첨부 될 때까지 기다려야합니다.

코드를 이동하면 onAttachedToWindow()문제 가 해결됩니다. 영구적 인 해결책은 아니지만 테스트 할 수있는 한 항상 작동했습니다.

제 경우에는 활동이 보이면 화면 밝기를 높여야했습니다. 의 줄 getWindow().getAttributes().screenBrightness에서 onResume()예외가 발생했습니다. onAttachedToWindow()작동 하도록 코드 이동 .


0

저에게는 staticDialogHelper.class 메서드에서 속성을 제거하여 수정되었습니다 (대화 상자 생성 및 숨기기에 대한 대응 가능). Window해당 메서드 와 관련된 속성이 있기 때문 입니다.


0

DependencyServices에서 위의 내용 중 아무것도 도움이되지 않았으므로 다음과 같이 끝났습니다.

    class Static_Toast_Android
    {
        private static Context _context
        {
            get { return Android.App.Application.Context; }
        }
        public static void StaticDisplayToast(string message)
        {
            Toast.MakeText(_context, message, ToastLength.Long).Show();
        }
    }
    public class Toast_Android : IToast
    {

        public void DisplayToast(string message)
        {
            Static_Toast_Android.StaticDisplayToast(message);
        }
    }

인터페이스는 정적 일 수 없기 때문에 "이중 클래스"를 사용해야합니다. 엘-


0

창을 추가 할 수 없습니다. 토큰이 유효하지 않습니다. 활동이 실행 중입니까?

이 충돌은 일반적으로 앱이 이전에 완료된 활동을 컨텍스트로 사용하여 대화 상자를 표시하려고 할 때 발생합니다. 예를 들어, 활동이 완료되었을 때 대화 상자를 표시하려고 시도하는 AsyncTask를 트리거하지만 사용자가 작업이 완료되기 전에 활동에서 뒤로 이동하는 경우 이러한 상황이 발생할 수 있습니다.

외부 자원

Android – 백그라운드 스레드에서 대화 상자 표시

오류 : BinderProxy @ 45d459c0이 유효하지 않습니다. 활동이 실행 중입니까?


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.