如何从Presenter类中的共享首选项中检索数据?

时间:2017-01-11 22:20:58

标签: android android-fragments sharedpreferences firebase-authentication firebase-cloud-messaging

我是Android和Firebase云消息传递MVP模式的新手。我有一个应用程序接收从Firebase控制台发送的FCM通知。

为了测试应用,我已使用FirebaseAuth将用户添加到Firebase,并使用电子邮件和密码身份验证。电子邮件和FCM令牌正在保存到SharedPreferences并正在接收通知。

问题:我现在需要从SharedPreferences和FCM令牌发送电子邮件到我的应用服务器。我在网上阅读了很多关于从SharedPreferencesContext检索数据的内容,但我仍然不能把它们放在一起。

我收到错误消息,指出方法getInstance(this)无法应用于LoginPresenter.java(请查看下面的代码段)。我很确定我做错了什么。请大家,指出我正确的方向。

public class LoginPresenter implements LoginContract.Presenter, LoginInteractor.Callback {

@Override
    public void onAuthSuccess() {
        //Show notifications
        mLoginView.showPushNotifications();

        //Get master token before sending it to the server
       String savedToken = FirebaseInstanceId.getInstance().getToken();
        //TODO:Check if token is not null.
        //Get user email
        final String savedEmail  = SharedPrefManager.getInstance(this).getUserEmail();
        saveTokenToServer(savedEmail, savedToken);
    }

我使用以下类来管理SharedPreferences:

public class SharedPrefManager {
  private static final String SHARED_PREF_NAME = "FCMSharedPref";
  private static final String TAG_EMAIL = "tagemail";

  private static SharedPrefManager mInstance;
  private static Context mCtx;

  private SharedPrefManager(Context context) {
    mCtx = context;
  }

  public static synchronized SharedPrefManager getInstance(Context context) {
    if (mInstance == null) {
      mInstance = new SharedPrefManager(context);
    }
    return mInstance;
  }

  //this method will save the email to shared preferences
  public boolean saveDeviceEmail(String email) {
    SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString(TAG_EMAIL, email);
    editor.apply();
    return true;
  }

  //this method will fetch the device token from shared preferences
  public String getUserEmail() {
    SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
    return sharedPreferences.getString(TAG_EMAIL, null);
  }

}

提前谢谢

3 个答案:

答案 0 :(得分:0)

您使用的是SharedPref错误。我无法提供比Android Developer的页面中提供的更简单的答案:

初始化SharedPrefs:

Context context = getActivity();
SharedPreferences sharedPref = context.getSharedPreferences(
        getString(R.string.preference_file_key), Context.MODE_PRIVATE);

写入SharedPrefs:

SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt(getString(R.string.saved_high_score), newHighScore);
editor.apply();
  

要从共享首选项文件中检索值,请调用此类方法   作为getInt()和getString(),提供所需值的键,   如果密钥不存在,则可选择返回默认值。对于   例如:

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
int defaultValue = getResources().getInteger(R.string.saved_high_score_default);
long highScore = sharedPref.getInt(getString(R.string.saved_high_score), defaultValue);

答案 1 :(得分:0)

这是一些示例代码。

SharedPreferences sharedPref = MainActivity.this.getPreferences(Context.MODE_PRIVATE);
fileIncrementer = sharedPref.getInt("incrementor", 0);
fileIncrementer++;
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt("incrementor", fileIncrementer);
editor.commit();

答案 2 :(得分:-1)

当您初始化context或使用Dagger注入时,您需要从Activity传递presenter

为了方便(我怀疑你没有使用依赖注入) - 在你的演示者中创建一个Constructor,它带有一个Context参数,可以为你提供Context使用

像这样。

     private Context mContext;

     public LoginPresenter (Context context){
       mContext = context
     }


    @Override
    public void onAuthSuccess() {
        mLoginView.showPushNotifications();

       String savedToken = FirebaseInstanceId.getInstance().getToken();

        final String savedEmail  = SharedPrefManager.getInstance(mContext).getUserEmail(); //See context used here
        saveTokenToServer(savedEmail, savedToken);
    }