【发布时间】:2014-02-18 17:19:54
【问题描述】:
问题
这个问题困扰我很久了。这不是很常见,但它确实不时发生。问题如下:
我在 SharedPreferences 中的 s Gson 序列化对象中保存了一堆用户首选项。这边走, 当我需要对象时,我将它加载到内存中,只调用一次存储。但是,由于某些奇怪的原因,我收到了这个错误:
java.lang.RuntimeException: Unable to resume activity {com.a.b/com.a.b.SomeActivity}: java.lang.RuntimeException: unable to parse type class com.a.b.storage.SomeClass$AppSettings with json: rialFinished":false,"lastOpenedAppId":0,"appVersion":35,"tutorialFinished":false}
可以看出,json 没有正确加载,它是一个无效的 json,所以尝试解析它只会引发异常。
一些额外的事实
- 每个抛出的异常都显示完全相同的 json 解析问题。出于某种原因,这是总是正在加载的字符串:
rialFinished":false,"lastOpenedAppId":0,"appVersion":35,"tutorialFinished":false}
这不是“特定于设备的问题”,或者至少我认为是这样。证据:
如您所见,它并非特定于设备。我也知道它也不是特定于 android 版本的,我们已经从 Android2.3.6、4.0.3、4.1.1、4.1.2、4.0.4记录了这个崩溃-
被序列化的类是
class AppSettings { private boolean tutorialFinished; private boolean googleAuthTutorialFinished; private int appVersion; private int lastOpenedAppId; public AppSettings() { tutorialFinished = false; appVersion = NO_STORED_VERSION; googleAuthTutorialFinished = false; } public boolean isTutorialFinished() { return tutorialFinished; } public void setTutorialFinished(boolean tutorialFinished) { this.tutorialFinished = tutorialFinished; } public void setAppVerions(int appVerions) { this.appVersion = appVerions; } public void setGoogleAuthTutorialFinished(boolean googleAuthTutorialFinished) { this.googleAuthTutorialFinished = googleAuthTutorialFinished; } /** * * @return the stored app version or {@link AppSettingsStorage#NO_STORED_VERSION} if none was found */ public int getAppVerions() { return appVersion; } public boolean isGoogleAuthTutorialFinished() { return googleAuthTutorialFinished; } public int getLastOpenedAppId() { return lastOpenedAppId; } public void setLastOpenedAppId(int lastOpenedAppId) { this.lastOpenedAppId = lastOpenedAppId; } } -
用来加载json的方法是:
private T fromJson(String json) { try { return gson.fromJson(json, type); } catch (Exception e) { throw new RuntimeException("unable to parse type " + type + " with json: " + json); } }
可能的原因:
https://code.google.com/p/android/issues/detail?id=14359。此问题表明某些 Android 设备无法很好地使用 SharedPreferences。虽然我确定这里不是具体问题,但我想知道它是否有什么关系。
这里可能存在一些奇怪的过程安全问题。 (Shared Preferences And Thread/Process safety)
AppSettings 是一个内部类。这会以某种方式影响 Gson 序列化吗?
【问题讨论】:
标签: android sharedpreferences gson