Anx*_*tta 11 android gson sharedpreferences
我byte[]在共享首选项中保存了一个.我可以关闭应用程序并使用共享首选项中持久保存的值重新打开它.运行应用程序并通过"任务管理器"或"强制关闭"关闭它时,将byte[]清除该共享首选项值.我不明白这一点,因为其他价值观仍然存在.
这让我相信这是由于某些gson或共享首选项问题,byte[]因此我将其转换为字符串,我仍然有问题.
编辑:
我在正常活动使用期间保存数据... 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;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
可悲的是,我在这里没有取得任何进展.有什么想法吗?
根据Super-califragilistic建议,我在检索值之前立即迭代SharedPreferences中的键/值对.我是Base64编码我的键值和值; 为了读取密钥以确保值在SharedPreferences中,我必须使用纯文本中的密钥.这解决了我的问题,因为byte[]现在正在正确地检索价值.
这对我来说很奇怪,但我可以用它作为解决方案.我仍然希望Base64对密钥进行编码,但这并不是非常重要.
删除了SharedPreference Key的Base64编码以进行存储和检索,并且值现在在所有情况下都保持不变.
这行代码String encodedObject = prefs.getString(encodedKey, null);意味着如果密钥不存在,它应该返回 null,因此您正在检查的密钥不存在。
要验证您的键/值是否存在,请使用此代码
for(Entry<String, ?> en : sharedPref.getAll().entrySet()){
en.getKey();//key
en.getValue();//value
}
Run Code Online (Sandbox Code Playgroud)
如果您检测到需要保存数据或已经尝试保存数据,您可以阻止这种情况发生override onPause(),例如。ActivityFragmentsaveTheValue(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;
Run Code Online (Sandbox Code Playgroud)
但既然你已经有了一个解决方案,那就把所有这些都划掉:)
| 归档时间: |
|
| 查看次数: |
538 次 |
| 最近记录: |