Frage

I'm using Facebook SDK in my application. My requirement is to maintain Facebook session for different users. I have all the user name in sqlite database. I used the following code to check whether the user has already logged into Facebook. If it is first time, I displayed the Facebook dialog and get the access token, and stored in db for the particular user and also invalidate the session of that user. The problem happens, when second user tries to login to Facebook. When the login dialog appears, it show leaked window error in log cat.

db = Stats.this.openOrCreateDatabase(DB_NAME,
                    MODE_PRIVATE, null);

            Cursor cur = db.rawQuery("SELECT * FROM " + USER_TABLE_NAME, null);
            if (cur != null) {
                if (cur.moveToFirst()) {
                    do {
                        String reader_name = cur.getString(cur
                                .getColumnIndex("username"));
                        Log.v("reader_name", reader_name);
                        if (reader_name.equals(reader_name_db)) {
                            if (cur.getString(cur.getColumnIndex("fb_token"))
                                    .equals("0")) {
                                authenticatedFacebook.authorize(Stats.this,
                                        PERMISSIONS, -1,
                                        new TestLoginListener());

                            } else {
                                accesstoken = cur.getString(cur
                                        .getColumnIndex("fb_token"));
                                Log.v("AccessToken", accesstoken);
                            }
                        }

                    } while (cur.moveToNext());
                }
            }
            cur.close();
            db.close();

            if (!accesstoken.equals("0")) {
                Toast.makeText(Stats.this, "Access token already present",
                        Toast.LENGTH_LONG).show();
                shareThroughFB();
            }

public class TestLoginListener implements DialogListener {

        public void onComplete(Bundle values) {
            // TODO Auto-generated method stub
            if (authenticatedFacebook.isSessionValid()) {
                accesstoken = authenticatedFacebook.getAccessToken();
                Log.v("AccessToken", accesstoken);
                db = Stats.this.openOrCreateDatabase(REDOMETER_DB_NAME,
                        MODE_PRIVATE, null);

                db.execSQL("update " + USER_TABLE_NAME + " set fb_token='"
                        + accesstoken + "' where username='" + reader_name_db
                        + "'");
                db.close();

    FbDialog.mSpinner.dismiss();
                fb_Logout();


                shareThroughFB();

            }
        }

        public void onFacebookError(FacebookError e) {
            // TODO Auto-generated method stub

        }

        public void onError(DialogError e) {
            // TODO Auto-generated method stub

        }

        public void onCancel() {
            // TODO Auto-generated method stub

        }

    }

It shows the following error.

 10-29 08:41:55.500: E/WindowManager(16738): Activity com.readometer.ReadometerTab has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{42b4e270 V.E..... R.....I. 0,0-1080,1920} that was originally added here
10-29 08:41:55.500: E/WindowManager(16738): android.view.WindowLeaked: Activity com.readometer.ReadometerTab has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{42b4e270 V.E..... R.....I. 0,0-1080,1920} that was originally added here
10-29 08:41:55.500: E/WindowManager(16738):     at android.view.ViewRootImpl.<init>(ViewRootImpl.java:426)
10-29 08:41:55.500: E/WindowManager(16738):     at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:235)
10-29 08:41:55.500: E/WindowManager(16738):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
10-29 08:41:55.500: E/WindowManager(16738):     at android.app.Dialog.show(Dialog.java:282)
10-29 08:41:55.500: E/WindowManager(16738):     at com.facebook.android.Facebook.dialog(Facebook.java:628)
10-29 08:41:55.500: E/WindowManager(16738):     at com.facebook.android.Facebook.startDialogAuth(Facebook.java:297)
10-29 08:41:55.500: E/WindowManager(16738):     at com.facebook.android.Facebook.authorize(Facebook.java:195)
10-29 08:41:55.500: E/WindowManager(16738):     at com.readometer.Stats.onClick(Stats.java:596)
10-29 08:41:55.500: E/WindowManager(16738):     at android.view.View.performClick(View.java:4354)
10-29 08:41:55.500: E/WindowManager(16738):     at android.view.View$PerformClick.run(View.java:17961)
10-29 08:41:55.500: E/WindowManager(16738):     at android.os.Handler.handleCallback(Handler.java:725)
10-29 08:41:55.500: E/WindowManager(16738):     at android.os.Handler.dispatchMessage(Handler.java:92)
10-29 08:41:55.500: E/WindowManager(16738):     at android.os.Looper.loop(Looper.java:137)
10-29 08:41:55.500: E/WindowManager(16738):     at android.app.ActivityThread.main(ActivityThread.java:5328)
10-29 08:41:55.500: E/WindowManager(16738):     at java.lang.reflect.Method.invokeNative(Native Method)
10-29 08:41:55.500: E/WindowManager(16738):     at java.lang.reflect.Method.invoke(Method.java:511)
10-29 08:41:55.500: E/WindowManager(16738):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
10-29 08:41:55.500: E/WindowManager(16738):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
10-29 08:41:55.500: E/WindowManager(16738):     at dalvik.system.NativeStart.main(Native Method)
10-29 08:41:55.510: E/WindowManager(16738): Activity com.readometer.ReadometerTab has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{42b592d8 V.E..... R.....ID 0,0-502,346} that was originally added here
10-29 08:41:55.510: E/WindowManager(16738): android.view.WindowLeaked: Activity com.readometer.ReadometerTab has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{42b592d8 V.E..... R.....ID 0,0-502,346} that was originally added here
10-29 08:41:55.510: E/WindowManager(16738):     at android.view.ViewRootImpl.<init>(ViewRootImpl.java:426)
10-29 08:41:55.510: E/WindowManager(16738):     at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:235)
10-29 08:41:55.510: E/WindowManager(16738):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
10-29 08:41:55.510: E/WindowManager(16738):     at android.app.Dialog.show(Dialog.java:282)
10-29 08:41:55.510: E/WindowManager(16738):     at com.facebook.android.FbDialog$FbWebViewClient.onPageStarted(FbDialog.java:197)
10-29 08:41:55.510: E/WindowManager(16738):     at android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:399)
10-29 08:41:55.510: E/WindowManager(16738):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-29 08:41:55.510: E/WindowManager(16738):     at android.os.Looper.loop(Looper.java:137)
10-29 08:41:55.510: E/WindowManager(16738):     at android.app.ActivityThread.main(ActivityThread.java:5328)
10-29 08:41:55.510: E/WindowManager(16738):     at java.lang.reflect.Method.invokeNative(Native Method)
10-29 08:41:55.510: E/WindowManager(16738):     at java.lang.reflect.Method.invoke(Method.java:511)
10-29 08:41:55.510: E/WindowManager(16738):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
10-29 08:41:55.510: E/WindowManager(16738):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
10-29 08:41:55.510: E/WindowManager(16738):     at dalvik.system.NativeStart.main(Native Method)
10-29 08:41:56.090: I/GATE(16738): <GATE-M>DEV_ACTION_COMPLETED</GATE-M>
10-29 08:41:56.090: D/AndroidRuntime(16738): Shutting down VM
10-29 08:41:56.095: W/dalvikvm(16738): threadid=1: thread exiting with uncaught exception (group=0x413a1930)
10-29 08:41:56.100: E/AndroidRuntime(16738): FATAL EXCEPTION: main
10-29 08:41:56.100: E/AndroidRuntime(16738): java.lang.IllegalArgumentException: View not attached to window manager
10-29 08:41:56.100: E/AndroidRuntime(16738):    at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:402)
10-29 08:41:56.100: E/AndroidRuntime(16738):    at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:304)
10-29 08:41:56.100: E/AndroidRuntime(16738):    at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:79)
10-29 08:41:56.100: E/AndroidRuntime(16738):    at android.app.Dialog.dismissDialog(Dialog.java:325)
10-29 08:41:56.100: E/AndroidRuntime(16738):    at android.app.Dialog.dismiss(Dialog.java:307)
10-29 08:41:56.100: E/AndroidRuntime(16738):    at com.facebook.android.FbDialog$FbWebViewClient.onPageFinished(FbDialog.java:203)
10-29 08:41:56.100: E/AndroidRuntime(16738):    at android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:408)
10-29 08:41:56.100: E/AndroidRuntime(16738):    at android.os.Handler.dispatchMessage(Handler.java:99)
10-29 08:41:56.100: E/AndroidRuntime(16738):    at android.os.Looper.loop(Looper.java:137)
10-29 08:41:56.100: E/AndroidRuntime(16738):    at android.app.ActivityThread.main(ActivityThread.java:5328)
10-29 08:41:56.100: E/AndroidRuntime(16738):    at java.lang.reflect.Method.invokeNative(Native Method)
10-29 08:41:56.100: E/AndroidRuntime(16738):    at java.lang.reflect.Method.invoke(Method.java:511)
10-29 08:41:56.100: E/AndroidRuntime(16738):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
10-29 08:41:56.100: E/AndroidRuntime(16738):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
10-29 08:41:56.100: E/AndroidRuntime(16738):    at dalvik.system.NativeStart.main(Native Method)
War es hilfreich?

Lösung

Remove this line

FbDialog.mSpinner.dismiss();

If dialog not disappear, put this in a try/catch:

try{
     FbDialog.mSpinner.dismiss(); 
 } catch(Exception e ) 
 { e.printStackTrace(); }

And post your stacktrace ;)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top