2012-11-22 101 views
0

我知道該異常來自未被解僱的對話框。登錄活動已泄露窗口

這裏是一個崩潰的應用程序(下面的代碼是活動的主要部分,其他的都只是小功能(沒有對話活動)

public void facebookLogin() 
{ 
    shareAppPreferences = new AppPreferences(getApplicationContext()); 
    facebook = new Facebook("something");//((GlobalVars)getApplicationContext()).facebook; 

    String access_token = shareAppPreferences.getAccessToken(); 
    Long expires = shareAppPreferences.getAccessExpires(); 
    Log.d("MyTag","token:" +access_token); 
    if(access_token != null) { 
     facebook.setAccessToken(access_token); 
    } 
    if(expires != 0) { 
     facebook.setAccessExpires(expires); 
    } 
    /* 
     * Only call authorize if the access_token has expired. 
     */ 
    if(!facebook.isSessionValid()) { 
     Log.d("MyTag","In Authorize"); 
      facebook.authorize(this, new String[] {"publish_stream", "email"}, Facebook.FORCE_DIALOG_AUTH, new DialogListener() { 
       public void onComplete(Bundle values) { 

        shareAppPreferences.saveAccessToken(facebook.getAccessToken()); 
        Log.d("MyTag","face token: " +facebook.getAccessToken()); 
        shareAppPreferences.saveAccessExpires(facebook.getAccessExpires()); 

       } 

       public void onFacebookError(FacebookError e) { 
       Toast.makeText(getApplicationContext(), "onFacebookError", Toast.LENGTH_SHORT).show(); 
      } 

      public void onError(DialogError e) { 
       Toast.makeText(getApplicationContext(), "onError", Toast.LENGTH_SHORT).show(); 
      } 
      public void onCancel() { 

      } 
      }); 
    } 
    new AccessKeyTask().execute("someURL"); 
    Intent intent = new Intent(this,MainActivity.class); 
    Log.d("MyTag", "starting activity"); 
    startActivity(intent); 

} 

這裏的logcat的例外部分:

11-22 18:32:06.484: I/MapActivity(19687): Handling network change notification:CONNECTED 
11-22 18:32:06.488: E/MapActivity(19687): Couldn't get connection factory client 
11-22 18:32:06.707: E/WindowManager(19687): Activity com.inturnex.allaround.Login has leaked window [email protected] that was originally added here 
11-22 18:32:06.707: E/WindowManager(19687): android.view.WindowLeaked: Activity com.inturnex.allaround.Login has leaked window [email protected] that was originally added here 
11-22 18:32:06.707: E/WindowManager(19687):  at android.view.ViewRoot.<init>(ViewRoot.java:260) 
11-22 18:32:06.707: E/WindowManager(19687):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148) 
11-22 18:32:06.707: E/WindowManager(19687):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
11-22 18:32:06.707: E/WindowManager(19687):  at android.view.Window$LocalWindowManager.addView(Window.java:424) 
11-22 18:32:06.707: E/WindowManager(19687):  at android.app.Dialog.show(Dialog.java:241) 
11-22 18:32:06.707: E/WindowManager(19687):  at com.facebook.android.Facebook.dialog(Facebook.java:839) 
11-22 18:32:06.707: E/WindowManager(19687):  at com.facebook.android.Facebook.startDialogAuth(Facebook.java:368) 
11-22 18:32:06.707: E/WindowManager(19687):  at com.facebook.android.Facebook.authorize(Facebook.java:231) 
11-22 18:32:06.707: E/WindowManager(19687):  at com.inturnex.allaround.Login.facebookLogin(Login.java:147) 
11-22 18:32:06.707: E/WindowManager(19687):  at com.inturnex.allaround.Login.onCreate(Login.java:55) 
11-22 18:32:06.707: E/WindowManager(19687):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
11-22 18:32:06.707: E/WindowManager(19687):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1628) 
11-22 18:32:06.707: E/WindowManager(19687):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1680) 
11-22 18:32:06.707: E/WindowManager(19687):  at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
11-22 18:32:06.707: E/WindowManager(19687):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
11-22 18:32:06.707: E/WindowManager(19687):  at android.os.Handler.dispatchMessage(Handler.java:99) 
11-22 18:32:06.707: E/WindowManager(19687):  at android.os.Looper.loop(Looper.java:130) 
11-22 18:32:06.707: E/WindowManager(19687):  at android.app.ActivityThread.main(ActivityThread.java:3703) 
11-22 18:32:06.707: E/WindowManager(19687):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-22 18:32:06.707: E/WindowManager(19687):  at java.lang.reflect.Method.invoke(Method.java:507) 
11-22 18:32:06.707: E/WindowManager(19687):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
11-22 18:32:06.707: E/WindowManager(19687):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
11-22 18:32:06.707: E/WindowManager(19687):  at dalvik.system.NativeStart.main(Native Method) 
11-22 18:32:07.402: D/PhoneWindow(19687): couldn't save which view has focus because the focused view [email protected] has no id. 
11-22 18:32:07.402: D/PhoneWindow(19687): couldn't save which view has focus because the focused view [email protected] has no id. 
+0

並不是說它會解決您的問題,而是嘗試用'getBaseContext()'替換'getApplicationContext()'。更好的辦法是,將'getBaseContext()'賦值給一個變量並使用它。 –

回答

3

當你的會話是無效的,你進入該if語句和執行一些Facebook登錄的代碼,這將打開一個對話框。您不會停止代碼的進度,因此此塊仍然會運行,即使它不應該直到Facebook身份驗證完成。

new AccessKeyTask().execute("someURL"); 
Intent intent = new Intent(this,MainActivity.class); 
Log.d("MyTag", "starting activity"); 
startActivity(intent); 

我建議把這個代碼放到一個函數調用completeLogin或東西,加入來電轉接到您onComplete並添加一個else到您的會話條件這就要求completeLogin也。

+0

非常感謝你,沒有注意到它..修正了我的問題! – idish

0

什麼線147?11-22 18:32:06.707: E/WindowManager(19687): at com.inturnex.allaround.Login.facebookLogin(Login.java:147)

恰好我的懷疑是一個的錯誤正在被調用,並且您正試圖在UI線程關閉後顯示Toast

嘗試使用runOnUIThread()

+0

在147中有facebook.authorize(...)。該代碼行顯示在代碼片段的上方。 – idish

相關問題