【问题标题】:getSharedPreferences return Null pointer exeption on some devices在某些设备上获取 SharedPreferences 返回 Null 指针异常
【发布时间】:2017-12-13 20:13:12
【问题描述】:

我在 Google Play 上有应用程序,在大多数设备上都可以正常工作,但在某些三星(SM-G531H、SM-G530BT)、华为、联想设备上似乎在getSharedPreferences 调用时崩溃。

我在片段方法中从onAttach(Context context) 引用上下文(我没有在onAttach 之前调用getSharedPreferences

@Override
    public void onAttach(Context context) {
        super.onAttach(context);

        mContext = context;
        //init firebase analytics
        mFirebaseAnalytics = FirebaseAnalytics.getInstance(context);
    }

我有 sharedPreference 带有构造函数的辅助类

 public UserStats(Context mContext) {

    CRASH HERE

        sharedPreferences = mContext.getSharedPreferences(PREF_USER,Context.MODE_PRIVATE); 

        }

这是fragment中调用sharedPreference的方法

private void setGoal(int calories){
        new UserStats(mContext).setNewGoal(calories);

        tvGoal.setText("Goal\n" + calories + " Cal");
    }

知道为什么会这样吗?以及如何避免它? (我无法调试它,我在 Firebase 控制台中收到崩溃)

【问题讨论】:

  • 请贴出所有相关代码。
  • 嘿,我看到onAtttach() 调用中提到的here 不一致。你检查了吗?我会说寻找替代品。
  • 有趣,但我之前使用过 getActivity() 并且结果相同
  • 你在哪里调用 setGoal() 方法?如果它是某些异步操作的结果,则片段可能已经与其活动分离,活动可能已经消失,剩下的只是一个过时的上下文引用。
  • 你从哪里给setGoal()打电话?还有一个小建议,在UserStats 的构造函数中,不要在参数名称前加上m。那是反对code-style-guide

标签: android android-fragments android-context


【解决方案1】:

如果可用,请始终使用 getApplicationContext()

【讨论】:

  • 并非总是如此。如果您想要特定于 Activity 的首选项,请使用 Activity Context。
【解决方案2】:

如果您正在活动,请使用getApplicationContext()

如果您在片段中,请使用getContext()

如果您在适配器类中,请使用context 并添加适配器构造函数的上下文参数。

【讨论】:

    【解决方案3】:

    使用 getActivity() 代替 mContext。它没有找到片段的引用。所以,应用程序崩溃了。

    【讨论】:

    • 我以前使用过 getActivity(),结果相同,我收到相同的崩溃
    猜你喜欢
    • 2015-01-09
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    相关资源
    最近更新 更多