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