靜態變數的陷阱,靜態變數陷阱

來源:互聯網
上載者:User

靜態變數的陷阱,靜態變數陷阱

我們都知道,靜態變數用起來是挺方便的,可是一不小心那就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重新賦值一次

 

 說到最後就是想說以後用靜態變數的時候記得更新變數的值,尤其是靜態變數引用了另一個變數的時候,僅僅改變那個被引用的變數是不行的,還要把靜態變數的值也更新了。(因為靜態變數什麼時候被回收具有不確定性)。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.