Android 編程中,使用靜態變數有哪些缺點?應該如何規範使用?
Android 系統開發,看過 Android 一些經典的應用,代碼裡面 static 類型的變數並不是經常使用,但在開發中 static 確實非常好用,跨 activity 沒問題,跨進程應該都可以吧。這個 static 有什麼缺點和優點,我們到底應該如何的規範使用呢?(補充下,主要想問的是:有什麼理由使我們在一些情況下不推薦用static變數?比如,service和activity通信,直接用static變數傳遞信息,這樣看似不是很規範。)
在Android中不應該使用static變數,static本身依賴進程模型,而Android力圖屏蔽進程的細節。
毫無疑問,Application類是你需要的選擇,那是堆積一些進程級別全局信息的最佳場所。Android 裡面的常量一般來說是繼承Application來定義.在使用時,getApplication()來拿到。
文檔如下:http://developer.android.com/reference/android/app/Application.html
至於static怎麼用什麼好處,應該去看java語法了。由於 Android 具有相應的生命周期的特徵,因此Android 程序不應該使用任何 static 變數,不應該並不是說不能,而是說使用static 變數很可能會導致bug。
有多種方式可以代替static 變數,比如繼承 Application 類,使用 preference ,使用 db,以及保存數據到靜態文件 等等首先靜態變數和靜態常量不一樣,後者一般是一些字元串或者基本數據類型,不屬於討論範圍。
對於前者,我的看法是可以隨便用,但是用完還是要置為null,由於寫代碼或者看代碼都會覺得不方便,維護就更麻煩了,所以很少有人這麼干。。。如果你膽敢這麼干,你同事可能會在心裡一遍又一遍的問候你。其實使用或者不使用static,完全看適用環境,沒有說好或不好,適用情況下就好。
static只能在進程內起作用,跨進程是沒用的。
大部分情況下,如果你的同一應用內多個activity/service之間共享數據,是可以考慮使用static變數的,當然另外的選擇是放在application裡面,兩者效果在大部分情況下差不多。但通常來說,static使用的情況下,代碼會減少一點,而非static就需要使用一些單例模式來存儲變數。
一般來說,static如果會有多線程訪問的問題下注意要加鎖。
另外,static最大的用途在於static final這種const類的常量。謝邀~
靜態常量確實在安卓這個很多頁面之間存在數據交互的系統里很好用,但是它占空間啊....
只有在持有者銷毀時才會被回收處理,即使沒有用到,它還是在那對於內存比較吃緊的機子來說,創建過多的靜態常量並非明智之舉關於Android 使用靜態變數,我遇到過的情況是:當應用不處於與當前用戶交互的情況時(例如回到HOME,跳到其他應用),離開的時間比較長時,應用的靜態變數有可能被置null, 是不保險的。
我好像使用static比較多的只有兩個地方,一個是用static final定義常量,一個是單例模式時。
static訪問是無法跨進程的。Android中的Activity,Service是可以在各自進程中運行的,用static傳遞參數到不同進程的Activity、Service時會錯。
Android Bundle是可以跨進程傳遞數據的。覺得還是使用Intent傳遞數據為好。Android中一個比較好的設計是,盡量讓上層不關注進程之類的東西,Activity,Service,Provider都是一個個組件。Activity、Service中使用Bundle傳遞機制接收參數,讓其可以提供服務給手機里所有程序。用static傳遞參數時,static定義的變數必然會設置為public或包內可訪問許可權。如果在其它類中被任意修改,程序肯定會亂。覺得不符合設計原則。"service和activity通信,直接用static變數傳遞信息,這樣看似不是很規範" 在同一個App內可以使用static變數共享這種方式,google更推薦使用使用Application子類進行信息共享,但是跨App訪問Service不可以,因為Android應用基於Linux的進程,不同進程間內存空間是隔離的,正確且google推薦的的方式是使用AIDL/IPC。
我想先說下我知道的吧:其實,如果直接訪問public static變數,會造成程序比較難以調試的缺點,這個把他限制成只能通過方法訪問,我想會不會好一些。這個應該是缺點之一?從android角度講,如果沒記錯的話,static是java虛擬機的生命周期,而android會為每個應用分配一個java虛擬機,android程序一般不會殺掉自己的進程,會在後台掛起,那麼內存的浪費,是否也應該是一個考慮因素?不知道以上是否為應該考慮的因素,有沒有其他限制我們使用static變數的原因呢?比如activity和service間通信,如果我定義一系列的static變數,貌似是比寫一大堆的aidl來方便?
如果是static變數,最好配上final關鍵字使用,只是定義而已。否則,可以考慮不用static,用單例模式。
我的意見是盡量不要使用靜態變數,值類型的靜態常量除外(final static).靜態變數在安卓上不比其他Java環境,不管變數本身寫在哪個類里,它一旦被代表組件的類初始化,比如被一個Activity初始化,它就會綁定在這個Activity類中..關鍵的地方來了,其他Java環境這個類一旦被載入,就可以存活到進程結束,因此給我們造成一種錯覺就是,靜態變數伴隨整個進程....而Android的類卻可能隨著組件的銷毀而卸載...這意味著你關閉一個Activity的時候,由這個Activity初始化的靜態變數也會被制空,因此它的生命周期是不穩定的
我覺得可用
推薦閱讀: