此問題已被竊聽我相當長的一段時間內存儲的JSON。這不是很常見,但它確實不時發生。問題如下:
我在SharedPreferences的s Gson序列化對象中保存了一堆用戶首選項。這樣, 當我需要對象時,我將它加載到內存中,只做1次調用存儲。然而,對於一些原因的bizzare我得到這個錯誤:
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序列化嗎?
我絕不錯過一個雙引號,這正是問題。當Gson序列化AppSetting對象時,應該是有效的json的json字符串被加載爲無效的json。你看到問題了嗎? – fernandohur
對不起。我不同意。你在json中所說的字符串是沒有正確格式化的JSON,就像你在這篇文章中描述的那樣。 – Martin