編輯:關於android開發
我們都知道,靜態變量用起來是挺方便的,可是一不小心那就say拜拜了。說一說我在項目中遇到的情況,測試了好多次,最後才發現原因。感動啊!
private static String UserRootPath = "/sdcard/User/"+UserManager.username;
private static String UserCache=UserRootPath+"/path";
目的:
在一個類中,定義了上面兩個靜態變量,想要實現不同用戶登錄創建不同的文件夾,UserManager.username為用戶名。
然後就掉進坑了。
情況是這樣的:
當我登錄一個賬號A,確實創建了對應文件夾A,但是注銷登錄,用另一個賬號B再次登陸的時候,卻不會再創建文件夾了B。Why,搗鼓了好久,在測試過程中發現登錄B後,UserManager確實變為B了,可是UserRootPath卻還是原來的那個"/sdcard/User/"+A。
對於靜態變量的陷阱我早有耳聞,所以立馬反應過來時靜態變量出了問題。
原來在關閉activity或者應用之後UserRootPath占用的內存還在,所以再次登錄的時候UserRootPath還是原來的值,不會改變,即使這個時候UserManager.username已經發生了改變(創建文件夾的時候在代碼中判斷該文件夾是否已經存在,因為路徑沒變,所以判斷出來的結果是已經存在,所以就不會再創建了)。事實證明,如果關閉應用後強制kill掉該應用的進程,那麼再次登錄就不會出現這種情況。
於是我在登陸之後重新給UserRootPath賦值一次。
本來以為解決了,卻發現B的子目錄沒有創建(+_+)。
原來子目錄UserCache引用了UserRootPath,類似於上面的情況,由於UserCache也是靜態變量,雖然再次登陸之後UserRootPath改變了,但是UserCache還是之前那個(由於沒有重新賦值,所以它裡面的UserRootPath還是之前那個沒有變)
於是我在登陸之後也給UserCache重新賦值一次。
說到最後就是想說以後用靜態變量的時候記得更新變量的值,尤其是靜態變量引用了另一個變量的時候,僅僅改變那個被引用的變量是不行的,還要把靜態變量的值也更新了。(因為靜態變量什麼時候被回收具有不確定性)。
Android移動APP開發筆記——Cordova(PhoneGap)通過CordovaPlugin插件調用 Activity 實例,phonegapcordova引言
Android 顯示意圖激活另外一個Actitity,androidactitity1、跳轉到一個新的Actitity 新建項目, 新建一個java類Other
Android基礎入門教程——10.14 Android GPS初涉 1.定位相關的一些API 1)LocationManager 官方A
計算器Pro應用項目源碼,計算器pro源碼 本計算器實現了一些簡單的功能,可能本身還存在一些缺陷,希望大家提建議,能夠改進一下。 源碼項目我已經上傳到源碼天堂那
Failed to apply plugin [id 'com.