精品伊人久久大香线蕉,开心久久婷婷综合中文字幕,杏田冲梨,人妻无码aⅴ不卡中文字幕

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
為何Android開發中不推薦使用全局變量傳參
分類: Android 2013-09-28 15:47 2821人閱讀 評論(3) 收藏 舉報

Android開發中一般都是使用Intent給Activity傳參。有時需要傳復雜對象時,我們會傾向于用全局變量(靜態變量或Application屬性)。但其實這樣做是有隱患的,跟Activity的生命周期有關,正好最近遇到這個問題,在這里寫一下。

大概情況是這樣的:ActivityA中點擊按鈕啟動ActivityB,同時要傳一個大數據對象,懶得對這個對象進行序列化,于是就直接搞了個全局變量ActivityB.param寫了進去,在ActivityB.onCreate里讀取并顯示信息,編譯運行一切正常。這樣過了大半個月似乎也沒發現什么問題。直到有一天發給客戶使用后,在友盟后臺看到了空指針錯誤,仔細分析堆棧代碼,錯誤就在ActivityB.onCreate里讀取全局變量時發生,也就是全局變量返回了空!

全局變量為空一般就是由于內存不足進程被KILL過重新創建了。按常理分析,ActivityA在給ActivityB.param賦值后會立即啟動ActivityB,這過程很短,進程不可能這么快被KILL,因此理論上ActivityB.onCreate中應該能讀取到ActivityB.param的。

實際上,在ActivityA給ActivityB.param賦值啟動ActivityB后,ActivityB.onCreate確實是能讀取到ActivityB.param的;但是,ActivityB并不能保證永遠在前臺,一旦ActivityB所在任務被切到后臺(如有電話打進來了),系統就可以在內存不足時將ActivityB所在的進程KILL掉;而當ActivityB所在任務被切回前臺(如電話打完了),這時系統會自動重新恢復ActivityB,這時全局變量自然就沒了。

有人說我不用靜態變量,用Application的屬性來存全局參數,是不是就可以避免這個問題了呢?其實也是不行的,因為進程被KILL再恢復后,Application對象也是銷毀重建了的;安卓系統并不保證會在KILL進程前給程序發通知,因此我們也無法在Application里保存恢復全局變量。

另外,全局變量也不能記錄安卓的界面Context相關的類(如Activity、View),因為安卓系統自動管理這些類,記錄它們會導致引用計數增加無法釋放的內存泄露問題;如果一定要記錄,則應該使用弱引用WeakReference。

總之安卓開發中是不推薦用全局變量傳參的。最好的辦法還是按照安卓的開發規范,完全使用Intent進行傳參,因為系統在KILL進程前會自動保存Activity堆棧,同時保存相關的Intent參數,并自動進行恢復。如果非要用全局變量,則至少必須在讀取全局變量處理時判斷是否為空,避免程序出錯崩潰;同時最好在onPause時自行保存數據以便被KILL后恢復。

但是我覺得全局變量也不是一無是處完全不能用,主要是要理解并避開安卓進程生命周期中全局變量的變化。例如用全局變量來記錄自己寫的全局處理類(如工廠類、類注冊器等),只要注意在被進程KILL后做好恢復工作,是完全可以的。

本站僅提供存儲服務,所有內容均由用戶發布,如發現有害或侵權內容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Android中context及全局變量小析
Android內存管理詳解(關于程序退出)
Android中Application類用法
Android使用Application總結
[C# 開發技巧]如何防止程序多次運行
堆和棧的區別
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯系客服!

聯系客服

主站蜘蛛池模板: 盐津县| 修文县| 墨玉县| 宁远县| 九江市| 绥宁县| 呼图壁县| 琼海市| 莫力| 朝阳县| 宿松县| 宜昌市| 天门市| 洮南市| 松滋市| 普安县| 耿马| 略阳县| 阳泉市| 开化县| 淄博市| 来宾市| 聂拉木县| 塔城市| 承德市| 延庆县| 德庆县| 会同县| 云霄县| 泰宁县| 舟山市| 晋州市| 青海省| 开封县| 上高县| 长泰县| 崇州市| 栾川县| 河东区| 昆明市| 巴东县|