2015-03-08 2 views
1

У меня есть метод в моем основном действии, который позволяет пользователю выйти из системы, если пользователь вошел в систему и зарегистрировался, если пользователь вышел из системы. Но приложение вылетает, когда я вызываю метод .logout() для facebook sdk. Мой код, в котором произошла ошибка Logcat возвращает NULLPOINTEREXCEPTION Ошибка в fb.logout (MainActivity.this);Сбой приложений при выходе из facebook, NullPointerException

public void loginFacebook(View v) { 
    // TODO Auto-generated method stub 
    new Thread(new Runnable() { 

     @Override 
     public void run() { 

      // log out if logged in 
      if (fb.isSessionValid()) { 
       try { 
        updateButtonImage(); 
        Log.d("Session Valid", "Session Valid"); 
        fb.logout(MainActivity.this); 
        if (fb.isSessionValid()) 
         Log.d("Session Valid", "Session Valid"); 
        else 
         Log.d("Session Not Valid", "Session Not Valid"); 

       } catch (MalformedURLException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 

      else { 
       // log in if logged out 
       Log.d("Session Not Valid", "Session Not Valid"); 
       // login 
       runOnUiThread(new Runnable() { 
        public void run() { 
         fb.authorize(MainActivity.this, 
           new DialogListener() { 

            // I have deleted this part as this is not relevant to this question 
           }); 

        } 
       }); 

      } 
     } 

    }).start(); 

} 

LogCat:

03-08 16:11:22.242: E/AndroidRuntime(11956): FATAL EXCEPTION: Thread-14 
03-08 16:11:22.242: E/AndroidRuntime(11956): java.lang.NullPointerException 
03-08 16:11:22.242: E/AndroidRuntime(11956): at android.webkit.CookieSyncManager.createInstance(CookieSyncManager.java:96) 
03-08 16:11:22.242: E/AndroidRuntime(11956): at com.facebook.internal.Utility.clearCookiesForDomain(Utility.java:554) 
03-08 16:11:22.242: E/AndroidRuntime(11956): at com.facebook.internal.Utility.clearFacebookCookies(Utility.java:578) 
03-08 16:11:22.242: E/AndroidRuntime(11956): at com.facebook.Session.closeAndClearTokenInformation(Session.java:798) 
03-08 16:11:22.242: E/AndroidRuntime(11956): at com.facebook.android.Facebook.logoutImpl(Facebook.java:669) 
03-08 16:11:22.242: E/AndroidRuntime(11956): at com.facebook.android.Facebook.logout(Facebook.java:646) 
03-08 16:11:22.242: E/AndroidRuntime(11956): at com.appquest.awaaziitkgp.MainActivity$4.run(MainActivity.java:167) 
03-08 16:11:22.242: E/AndroidRuntime(11956): at java.lang.Thread.run(Thread.java:1019) 
+0

Опубликовать свой стек trace – Apurva

+0

Отредактировал вопрос –

ответ

0

По какой-то причине, Facebook объект fb становится null внутри метода run(). Вы можете позвонить по телефону

session.closeAndClearTokenInformation(); 

вместо этого, что делает то же самое. Или вы можете попытаться выяснить, почему fb становится null. Я подозреваю, что это связано с тем, что вы используете его на отдельном Thread (и я действительно не вижу в этом необходимости).

+0

У меня был некоторый код в этом потоке, прежде чем требуется загрузка некоторых данных из Интернета. Я удалил нить, и теперь она работает нормально. Благодарю. –

+0

Однако я не понимаю, в чем проблема. Я инициализировал переменную fb в onCreate() как fb = new Facebook (APP_ID); –

+0

Я подозреваю, что объекты класса 'Facebook' не являются * потокобезопасными *, и в этом случае они не могут быть доступны как поля классов, они должны быть предоставлены в конструкторе для этого потока. Это необходимо проверить в документации. Этот тип проблемы является примером того, почему разработчики фреймворка Android приняли единую политику в отношении пользовательского интерфейса, что позволяет разработчикам выполнять свою работу без необходимости синхронизации обратных вызовов и полей ... –

Смежные вопросы