Android 发布从SharedReferences读取数据。我必须运行两次应用程序才能存储数据

Android 发布从SharedReferences读取数据。我必须运行两次应用程序才能存储数据,android,sharedpreferences,Android,Sharedpreferences,我在读android中的SharedReferences时遇到了一个问题。数据存储在首选项文件中,我确信这一点,因为我在从首选项中读取数据时立即使用logcat记录数据,并且在从首选项中读取数据后使用toast消息显示数据。但是,当我尝试再次从一个新活动读取数据时,它会返回一个默认的空sting。当我存在应用程序并再次运行它时,它会读取以前存储的数据。这是我最初保存数据时的代码,它还包含我用来验证存储的数据是否已被读回的注释: public void downloadMatchesAsync()

我在读android中的SharedReferences时遇到了一个问题。数据存储在首选项文件中,我确信这一点,因为我在从首选项中读取数据时立即使用logcat记录数据,并且在从首选项中读取数据后使用toast消息显示数据。但是,当我尝试再次从一个新活动读取数据时,它会返回一个默认的空sting。当我存在应用程序并再次运行它时,它会读取以前存储的数据。这是我最初保存数据时的代码,它还包含我用来验证存储的数据是否已被读回的注释:

public void downloadMatchesAsync() {

    brawtaAPIAdapter.runGetMatches(new Callback<JSONKeys>() {

        @Override
        public void success(JSONKeys jsonKeys, Response response) {
            Log.d(ApplicationConstants.TAG, "blarg");
            Success = jsonKeys.isSuccess();
            message = jsonKeys.getErrorMessage().toString();

            if(!message.isEmpty()){
                Toast.makeText(MyApplication.getAppContext(), message,    Toast.LENGTH_SHORT).show();
            }

            Gson gson = new Gson();
            String jsonObject = gson.toJson(jsonKeys); //converts java object into json string'


            Preferences.saveToPreferences(activity, ApplicationConstants.match_data, jsonObject);
            //data =Preferences.readFromPreferences(activity, ApplicationConstants.match_data, "no data");
            //Toast.makeText(MyApplication.getAppContext(), "In networkOperation" + data, Toast.LENGTH_LONG).show();
        }

        @Override
        public void failure(RetrofitError error) {

        }
    }); // Call Async API

    //return data;
}
但代码只返回存储的数据,如果我存在应用程序并再次运行它

这是我最喜欢的课程:

   public class Preferences {

private static final String PrefName = "net.brawtasports.brawtasportsgps";

public static void saveToPreferences(Context context, String key, String value) {

    SharedPreferences sharedPreferences = context.getSharedPreferences(PrefName, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString(key, value);
    editor.apply();
}

public static String readFromPreferences(Context context, String key, String defaultValue) {

    SharedPreferences sharedPreferences = context.getSharedPreferences(PrefName, Context.MODE_PRIVATE);
    return sharedPreferences.getString(key, defaultValue);

}
}


问题是什么?

apply是一个异步调用,因此不必立即存储数据。请尝试调用.commit。

首选项类是什么样子的?如果您在将数据写入SharedReferences时遇到问题,那么显示数据写入的位置对于理解问题很重要。刚刚添加了另一个类您称之为commit吗?我尝试了commit,但这不起作用。我从设备上卸载了应用程序,并使用commit语句再次运行它,但这不起作用,就像我说的数据被保存了一样,因为我可以在保存数据后立即将其读回。除非我运行了两次应用程序,否则不会立即从第二个活动中读取数据。是不是在“成功”呼叫完成之前(即数据保存之前)启动了一个新的活动?这听起来可能是原因。不过我不确定。我在第二个活动的oncreate方法中调用了read函数,但它仍然让我感到困惑,为什么在调用第二个活动时,它一开始就被存储,而没有显示出来
   public class Preferences {

private static final String PrefName = "net.brawtasports.brawtasportsgps";

public static void saveToPreferences(Context context, String key, String value) {

    SharedPreferences sharedPreferences = context.getSharedPreferences(PrefName, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString(key, value);
    editor.apply();
}

public static String readFromPreferences(Context context, String key, String defaultValue) {

    SharedPreferences sharedPreferences = context.getSharedPreferences(PrefName, Context.MODE_PRIVATE);
    return sharedPreferences.getString(key, defaultValue);

}