android - NullPointerException getSupportFragmentManager() 与 Facebook onSessionStateChange

标签 android nullpointerexception facebook-login fragmentmanager facebook-sdk-3.1

我正在使用 Facebook SDK 进行 FB 登录。有时我在从 Facebook 登录返回时收到随机的 NullPointerException

NPE 在我的线上:

FragmentManager fm = getActivity().getSupportFragmentManager();

我的 FB 登录在一个单独的 Fragment 中。当用户登录 FB 并成功时,它会将 Fragment 更改为另一个。 为什么我会得到这个 NPE?

private void onSessionStateChange(Session session, SessionState state, Exception exception) {
    if (state.isOpened()) { 
        Log.i("Facebook", "Logged In");
        mPrefs.setFbLoggedIn(true);

        Request.newMeRequest(session, new Request.GraphUserCallback() {
            @Override
            public void onCompleted(GraphUser user, Response response) {
                if (response.getError() == null) {
                    FragmentManager fm = getActivity().getSupportFragmentManager();
                    FragmentTransaction ft = fm.beginTransaction();
                    ft.setCustomAnimations(R.anim.slide_in_right_to_left, R.anim.slide_out_right_to_left, 
                            R.anim.slide_in_right_to_left, R.anim.slide_out_right_to_left);
                    ft.remove(fm.findFragmentById(R.id.container));
                    ft.add(R.id.container, LoadingFragment.newInstance(), "loadingFragment");
                    ft.commit();

                    String fbId = "";
                    try { fbId = user.getId(); }
                    catch (NullPointerException e) { e.printStackTrace(); }

                    String fullName = "";
                    try { fullName = user.getName(); }
                    catch (NullPointerException e) { e.printStackTrace(); }

                    String email = "";
                    try { email = user.getProperty("email").toString(); }
                    catch (NullPointerException e) { e.printStackTrace(); }

                    String gender = "";
                    try { gender = user.getProperty("gender").toString(); }
                    catch (NullPointerException e) { e.printStackTrace(); }

                    String pictureUrl = "";
                    try { pictureUrl = "http://graph.facebook.com/" + user.getId() + "/picture?type=large"; }
                    catch (NullPointerException e) { e.printStackTrace(); }

                    String birthdate = "";
                    try {
                        if (user.getBirthday() != null && !user.getBirthday().isEmpty()) {
                            try { 
                                DateTime dateTime = DateTime.parse(user.getBirthday(), DateTimeFormat.forPattern("MM/dd/yyyy"));
                                DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZZ")
                                        .withZone(DateTimeZone.getDefault());
                                birthdate = formatter.print(dateTime);
                            } 
                            catch (IllegalArgumentException e) { e.printStackTrace(); }
                        }
                    }
                    catch (NullPointerException e) { e.printStackTrace(); }

                    User u = new User(fbId, email, fullName, gender, birthdate, pictureUrl);
                    FacebookMethods.writeFbInfo(getActivity(), u);

                    ((MainActivity)getActivity()).connectToServer();
                }
                else {
                    Toast.makeText(getActivity(), response.getError().getErrorMessage(), Toast.LENGTH_SHORT).show();
                }
            }
        }).executeAsync();
    } 
    else if (state.isClosed()) { 
        Log.i("Facebook", "Logged Out"); 
        mPrefs.setFbLoggedIn(false);
    }
}

Stacktrace(不完整,但重要的几行)

java.lang.NullPointerException
   at com.walintukai.lfdate.LoginFragment$2.onCompleted(LoginFragment.java:278)
   at com.facebook.Request$1.onCompleted(Request.java:303)
   at com.facebook.Request$4.run(Request.java:1726)
   at android.os.Handler.handleCallback(Handler.java:733)
   at android.os.Handler.dispatchMessage(Handler.java:95)
   at android.os.Looper.loop(Looper.java:136)
   at android.app.ActivityThread.main(ActivityThread.java:5050)
   at java.lang.reflect.Method.invokeNative(Method.java)
   at java.lang.reflect.Method.invoke(Method.java:515)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
   at dalvik.system.NativeStart.main(NativeStart.java)

最佳答案

如果 Activity 已停止(后退按钮、主页、最近...),此处的 getActivity() 可以返回 null。

为避免错误,只需提前停止该方法:

   Request.newMeRequest(session, new Request.GraphUserCallback() {
        @Override
        public void onCompleted(GraphUser user, Response response) {
            if (getActivity() == null) {
                // The activity was stopped
                return;
            }
            // else we can continue 
            // ...
        }
    });

关于android - NullPointerException getSupportFragmentManager() 与 Facebook onSessionStateChange,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25455460/

相关文章:

android - 如何在多个按钮单击的对话框中更改TextView的文本?使用kotlin

java - NullPointerException 错误,将 string[] 转换为 int[]

Facebook 登录 - 应用程序委托(delegate)中的 Sigabrt 错误和应用程序崩溃

javascript - Facebook 登录按钮 - 如何在尝试登录之前检查我们是否已登录?

ios - Beta 测试、Facebook 登录、Parse。某些用户的 Facebook 信息未保存到 Parse。 swift

android - 服务和 cordova 插件

android:pivotY 不会向我的 android 矢量可绘制对象添加顶部填充

java - 在 Android 的 GridView 中创建可点击的图像

java - Firebase 数据库数据检索在空对象引用上给出 NullPointerException 'java.lang.String java.lang.Object.toString()'

gwt - 使用带有 HashMap 的 GWT 的 AutoBean 反序列化时出现 NullPointerException