【问题标题】:How to retrieve data from Shared Preferences inside Presenter Class?如何从 Presenter 类中的共享首选项中检索数据?
【发布时间】:2017-05-26 21:18:11
【问题描述】:

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

为了测试应用程序,我使用 FirebaseAuth 向 Firebase 添加了一个用户,并通过电子邮件和密码进行身份验证。电子邮件和 FCM 令牌正在保存到 SharedPreferences 并且正在接收通知。

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

我收到一条错误消息,指出方法 getInstance(this) 不能应用于 LoginPresenter.java(检查下面的代码 sn-p)。我很确定我做错了什么。请各位,指出我正确的方向。

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);
  }

}

提前谢谢你

【问题讨论】:

  • this 指的是没有 Context 的 Presenter,您可以使用 this 引用,您必须将 Context 传递给您的 Presenter 或从您的 @987654332 中检索它@

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


【解决方案1】:

您使用 SharedPrefs 错误。我无法提供比 Android 开发者页面中已经提供的更简单的答案:

初始化 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);

【讨论】:

  • preference_file_key 应该是什么?如何解决这个符号?
【解决方案2】:

这是一些示例代码。

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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 2020-10-04
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 2023-01-25
    相关资源
    最近更新 更多