日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

静态变量的陷阱

發布時間:2024/4/17 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 静态变量的陷阱 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

?

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

?

轉載于:https://www.cnblogs.com/tangZH/p/6181722.html

總結

以上是生活随笔為你收集整理的静态变量的陷阱的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。