问题
我在共享首选项中保存了byte[]
。我可以关闭该应用程序,然后使用共享首选项中的持久值重新打开它。当运行该应用程序并通过“任务管理器”或“强制关闭”将其关闭时,byte[]
的“共享首选项”值将被清除。我不明白这一点,因为其他值仍然有效。
这使我相信这是由于byte[]
的某些gson或Shared Preference问题所致,因此我将其转换为String仍然存在问题。
编辑:
我在正常 Activity 使用期间保存数据,例如在onCreate()
之后。不是在onPuse()
或onDestroy()
期间,我忘了提到这一点。如果我在这里调用了它,而在“强制关闭”方案中没有调用其中一个或两个,那将是有道理的。
共享首选项代码
稍作修改以删除特定于应用程序的实现和数据
private static final String SHARED_PREFERENCES_FILE_NAME = "SharedPreferenceName";
public static void setSharedPreferenceObjectBase64Encoded(Context context, String key, Object object) throws Exception {
// Need an editor to update shared preference values
SharedPreferences.Editor editor = context.getSharedPreferences(SHARED_PREFERENCES_FILE_NAME, Context.MODE_PRIVATE).edit();
Gson gson = new GsonBuilder().serializeNulls().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").create();
String encodedKey = Base64.encodeToString(key.getBytes(), 0, key.getBytes().length, Base64.DEFAULT);
String stringObject = gson.toJson(object);
String encodedObject = Base64.encodeToString(stringObject.getBytes(), 0, stringObject.getBytes().length, Base64.DEFAULT);
editor.putString(encodedKey, encodedObject);
editor.apply();
}
public static Object getSharedPreferenceObjectBase64Encoded(Context context, String key, Class<? extends Serializable> objectClass) throws Exception {
// Need an editor to update shared preference values
SharedPreferences prefs = context.getSharedPreferences(SHARED_PREFERENCES_FILE_NAME, Context.MODE_PRIVATE);
Gson gson = new GsonBuilder().serializeNulls().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").create();
String encodedKey = Base64.encodeToString(key.getBytes(), 0, key.getBytes().length, Base64.DEFAULT);
String encodedObject = prefs.getString(encodedKey, null);
if (encodedObject == null) {
throw new NullPointerException("encodedObject is null : No shared preference exists for key.");
}
String decodedObject = new String(Base64.decode(encodedObject, Base64.DEFAULT));
if(decodedObject == null){
throw new NullPointerException("decodedObject is null : Json decoding error.");
}
Object resultObject = gson.fromJson(decodedObject, objectClass);
if (resultObject == null) {
throw new NullPointerException("resultObject is null : Json decoding error.");
}
return resultObject;
}
`byte []`代码
public static final String VALUE_KEY= "value.key";
public static void saveTheValue(Context context, byte[] encryptedPin) {
try {
USharedPreferenceManager.setSharedPreferenceObjectBase64Encoded(context, VALUE_KEY, encryptedPin);
} catch (Exception e) {
}
}
public static byte[] getTheValue(Context context) {
try {
return (byte[]) USharedPreferenceManager.getSharedPreferenceObjectBase64Encoded(context, VALUE_KEY, byte[].class);
} catch (Exception e) {
return null;
}
}
任何投入将不胜感激..
可悲的是,我在这里没有任何进展。有什么想法吗?
更新:
根据 super 校准建议,我在检索值之前立即遍历了SharedPreferences中的键/值对。我是使用Base64编码键和值的;为了读取 key 以确保该值在SharedPreferences中,我必须使用纯文本形式的 key 。这为我解决了这个问题,因为现在可以正确检索
byte[]
值。这对我来说似乎很奇怪,但我可以将其用作解决方案。我仍然想对Base64编码 key ,但这并不是非常重要。
当前解决方案:
删除了SharedPreference Key的Base64编码以进行存储和检索,该值现在在所有情况下都保持不变。
最佳答案
这行代码String encodedObject = prefs.getString(encodedKey, null);
表示如果 key 不存在,则应返回null,因此您要检查的 key 不存在。
要验证您的键/值是否存在,请使用此代码
for(Entry<String, ?> en : sharedPref.getAll().entrySet()){
en.getKey();//key
en.getValue();//value
}
您可以阻止
override
或onPause()
中的Activity
Fragment
发生,并在检测到需要保存数据或已尝试保存数据的情况下调用saveTheValue(Context context, byte[] encryptedPin)
。private boolean forceSaveInOnPause= false;//global variable
//in your saving method
....//after you save
forceSaveInOnPause = true;
//in your onPause of Activity
if(forceSaveInOnPause){
//re-save
forceSaveInOnPause = false;
但是,既然您已经有了解决方案,请从头开始:)
关于android - 通过 'Force Stop'或任务管理器终止应用程序后,将清除sharedpreference byte []值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38793374/