【问题标题】:Store value to Shared Preferences in a service class FirebaseInstanceIDService将值存储到服务类 FirebaseInstanceIDService 中的共享首选项
【发布时间】:2018-09-05 05:07:32
【问题描述】:

我正在尝试将用户字符串的类型存储在 Activity 中的 Shared Preferences 中,但是当我尝试从服务类中的 Shared Preferences 中 getString 在这种情况下 myFirebaseInstanceIDService 它不断给我一个 Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference 错误。

这是我的价值所在

btNext.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivity(new Intent(RegisterTutorActivity.this, ChooseSub.class));
            SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context);
            sharedPref.edit().putString("Type", "Tutor").apply();
            signUpTutor();
        }
    });

在 myFirebaseInstanceIDService 中

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {
private FirebaseAuth mAuth = FirebaseAuth.getInstance();

private String type;
SharedPreferences sharedPref;

@Override
public void onTokenRefresh() {
    super.onTokenRefresh();
    if(mAuth.getCurrentUser() != null)
    {

        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
        Log.d(TAG, "Refreshed token: " + refreshedToken);
        sendRegistrationToServer(refreshedToken);
    }
}

public void sendRegistrationToServer(String refreshedToken)
{
    sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
    type = sharedPref.getString("Type", "");
    FirebaseDatabase.getInstance().getReference().child("Users").child(type).child(mAuth.getCurrentUser().getUid())
            .child("tokenID").setValue(refreshedToken);
}
}

我现在真的不知道共享首选项有什么问题?

【问题讨论】:

  • 您在哪一行收到此错误?
  • 尝试使用'SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());'而不是 'SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context);'
  • 错误发生在SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context);
  • 并且使用 getApplicationContext() 不起作用
  • 确保上下文的值不为空

标签: android firebase firebase-cloud-messaging sharedpreferences


【解决方案1】:

您可以将令牌存储在 Shared Preferences 中,直到您的应用准备好使用它:

SharedPreferences sharedPref = getSharedPreferences( getPackageName() + "_preferences", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.edit().putString("Type", "Tutor");     
editor.commit();
signUpTutor();

您可以像这样请求令牌:

SharedPreferences sharedPref = getApplicationContext().getSharedPreferences("Type", Context.MODE_PRIVATE);
      String  type = sharedPref.getString("Type", null);

【讨论】:

  • 我不能使用底部代码,因为它是一个服务类
  • 哦。我的错!请再次检查
  • 还感觉顶部代码将用于实际活动中,我应该为 getActivity() 替换什么
  • getActivity() 是你的类上下文
  • 我无法在 Activity 中获取 Activity 并出现新错误
【解决方案2】:

我创建了一个类来简化SharedPreferences 的操作。在这里分享,希望对你有帮助。

public class PreferenceUtils {

    private SharedPreferences pref;
    private SharedPreferences.Editor editor;

    public PreferenceUtils(Context context) {
        pref = PreferenceManager.getDefaultSharedPreferences(context);
    }

    public void setPrefrences(String key, String value) {
        editor = pref.edit();
        editor.putString(key, value);
        editor.apply();
    }

    public void setPrefrences(String key, int value) {
        editor = pref.edit();
        editor.putInt(key, value);
        editor.apply();
    }

    public void setPrefrences(String key, boolean value) {
        editor = pref.edit();
        editor.putBoolean(key, value);
        editor.apply();
    }

    public String getPrefrence(String key, String Default) {
        return pref.getString(key, Default);
    }

    public int getPrefrence(String key, int Default) {
        return pref.getInt(key, Default);
    }

    public boolean getPrefrence(String key, boolean Default) {
        return pref.getBoolean(key, Default);
    }

    public void deletePref(String[] key) {
        editor = pref.edit();
        for (int i = 0; i < key.length; i++)
            editor.remove(key[i]);
        editor.apply();
    }

    public void deletePref(String key) {
        editor = pref.edit();
        editor.remove(key);
        editor.apply();
    }
}

现在你想在哪里使用SharedPreferences,只需在那里初始化这个类。

对于活动,

PreferenceUtils utils = new PreferenceUtils(classname.this);

对于片段,

PreferenceUtils utils = new PreferenceUtils(getActivity());

为了服务,

PreferenceUtils utils = new PreferenceUtils(getApplicationContext()); 

现在要保存值,您只需使用 PreferenceUtils 类的对象,

例如在你的情况下,

utils.setPrefrences("Type", "Tutor");

您也可以轻松地使用该对象获得价值,

utils.getPrefrence("Type", null);

快乐编码。

【讨论】:

  • 感谢您提供此类,但由于某种原因,我现在在将上下文分配给类构造函数中的 getDefaultSharedPreferences 时不断收到相同的错误“尝试调用虚拟方法 'java.lang.空对象引用上的字符串 android.content.Context.getPackageName()'"
  • 我的 android 清单中是否需要一些东西来共享首选项,因为每次我尝试从服务类获取上下文时都会得到 null
  • 代替sharedPref = PreferenceManager.getDefaultSharedPreferences(this); 试试sharedPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
  • 在清单中你只需要声明服务类。我猜你已经做到了。
  • 感谢这段代码对我有用,我创建了一个 MyApplication 类来获取我的 getApplictionContext
【解决方案3】:

好的,感谢大家,我找到了我的问题。我创建了一个扩展 Application 的 MyApplication 类并创建了一个 getContext 方法。现在它可以工作了。谢谢你帮助我。

【讨论】:

    【解决方案4】:

    在共享首选项中写入数据时使用 commit() 而不是 apply()

       sharedPref.edit().putString("Type", "Tutor").commit();
    

    【讨论】:

      猜你喜欢
      • 2018-06-10
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      • 1970-01-01
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      • 2011-09-03
      相关资源
      最近更新 更多