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