static 修飾的靜態(tài)變量,使用很方便,在不同的類(lèi)和包中都可以使用,在虛擬機中單獨占用內存,沒(méi)錯,這些都是它們的優(yōu)點(diǎn),不過(guò)在項目上線(xiàn)后,才發(fā)現static有一些不太好的地方。
在查看項目的崩潰信息時(shí),發(fā)現很多地方莫明的出現空指針異常的錯誤,經(jīng)過(guò)排查,發(fā)現可能就是static的問(wèn)題。我們在項目中,將用戶(hù)的信息也就是User對象保存成了一個(gè)靜態(tài)變量,而在報錯的地方,也都發(fā)現有使用過(guò)這種變量,因此,可以大致推斷出與這種保存的方式有一定的聯(lián)系。同時(shí),有不少用戶(hù)反映在打開(kāi)應用的情況下,接個(gè)電話(huà)或者長(cháng)時(shí)間待機后,再回到應用也會(huì )出現崩潰的現象,而這些崩潰都與靜態(tài)變量的空指針有關(guān)系。
如此來(lái)說(shuō)的話(huà),static靜態(tài)修飾在A(yíng)ndroid的開(kāi)發(fā)中是不是很危險?或許我們可以說(shuō)如果是static User u = new User();這樣定義的話(huà),那么應該不會(huì )有太大問(wèn)題,而如果是static User u;這樣定義的話(huà),那么很可以會(huì )出現NULL的現象。當然,前面的方法里面的屬性也可能會(huì )現空的情況,但是這個(gè)可以用封裝來(lái)避免空指針。另外靜態(tài)常量還是很好用的。
那么應該如何保存登錄或者全局的信息呢?根據Google官方的推薦以及百度到的各位大神的推薦,我們應該盡量使用繼承自Application的自定義類(lèi),在我們繼承的類(lèi)中定義需要全局使用的變量,并通過(guò)getApplicationContext()來(lái)獲取和保存相關(guān)的變量即可。實(shí)例:
- package com.jony.bitmaptest;
-
- import android.app.Application;
- import android.os.Handler;
-
- public class MyAplication extends Application{
- // 引發(fā)異常:在一些不規范的代碼中經(jīng)??吹紸ctivity或者是Service當中定義許多靜態(tài)成員屬性。這樣做可能會(huì )造成許多莫名其妙的null pointer異常。
-
- // 異常分析:Java虛擬機的垃圾回收機制會(huì )主動(dòng)回收沒(méi)有被引用的對象或屬性。在內存不足時(shí),虛擬機會(huì )主動(dòng)回收處于后臺的Activity或Service所
- // 占用的內存。當應用再次去調用靜態(tài)屬性或對象的時(shí)候,就會(huì )造成null pointer異常
-
- // 解決異常:Application在整個(gè)應用中,只要進(jìn)程存在,Application的靜態(tài)成員變量就不會(huì )被回收,不會(huì )造成null pointer異常
- private static final int MSG = 0X1;
- private Handler mHandler = new Handler(){
- public void handleMessage(android.os.Message msg) {
- switch (msg.what) {
- case MSG:
-
- break;
-
- default:
- break;
- }
- };
- };
- private String action;
- private String username;
- private String password;
- @Override
- public void onCreate() {
- // TODO Auto-generated method stub
- super.onCreate();
- }
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public String getAction() {
- return action;
- }
- public void setAction(String action) {
- this.action = action;
- }
- public Handler getHandler(){
- return mHandler;
- }
- }
在A(yíng)ctivity或Service中的使用方法:
- MyApplication application = (MyApplication) this.getApplicationContext();
Application是與應用同時(shí)存在的,也就是應用在它就在,并不會(huì )被GC給莫名其妙的回收掉,因此,使用此方法更加安全。
鏈接地址
http://www.2cto.com/kf/201205/133951.html
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。