在做Android項目時,使用了SharePreference保存用戶登錄狀態和一些字段信息。由於需要在進入用戶模塊時進行登錄狀態判斷及信息載入,寫了一個checkUserstate的函數,主要是抽取SP中的信息,判斷用戶是否已登錄。
此部分最開始我設想使用一個布爾型的flag進行登錄判斷,在沒完成具體業務的時候,預先寫了一個flag,並使用SP.getBoolean(“”,false),獲得存儲的登陸標誌。
在完成了註冊和登錄業務後,準備具體調試這個用戶模塊,由於考慮到具體的業務實現,界面的載入被劃分爲三種情況,因此我改寫了flag爲int型,以方便進行判斷。此時,我改寫了所有的SP.getBoolean爲SP.getInt,並將涉及到的所有SP關係都重寫修改了。
改寫完登錄狀態驗證後,重新進行測試。此測試,SP還未寫入任何數據,因此getInt和其他方法都應得到缺省值。
此時,系統報了一個java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.Integer 錯誤。
這個錯誤也算是比較常見,但定位到的是getInt(“login”,0),提示該方法返回了Boolean型。
以下是我的調試步驟:
1.進行debug,但運行到getInt方法後,直接報錯跳出,且無法顯示getInt返回值。
2.改寫爲Boolean flag=SP.getInt(“login”,0),系統提示類型錯誤
3.檢查了在getInt前,確定未進行任何SP的寫入操作
判斷:
根據之前SQLite的使用經驗,判斷可能是SP的“login”預先寫入了值,因此getInt方法獲得了返回(不是缺省值0),由於一些系統的Boolean型認爲,false和0是可以對應的,所以getInt把“login”的false值返回了。
爲什麼“login”鍵值對有值呢?我認爲可能是我之前執行getBoolean(“login”,false)時,雖然沒有對SP進行寫入(從未執行過SP寫入),但get方法返回缺省值的同時,給“login”寫入了缺省值造成的。
解決:
主要是刪除數據庫和SP。
由於SP和SQLite都是跟隨APP存在的,此時,只有在模擬器上手動卸載APP,才能保證數據庫和SP被清除。
完成卸載後,重新安裝運行APP,果然成功通過了。
PS:本寶寶心好累……