安卓中static使用误区

static 修饰的静态变量,使用很方便,在不同的类和包中都可以使用,在虚拟机中单独占用内存,没错,这些都是它们的优点,不过在项目上线后,才发现static有一些不太好的地方。
在查看项目的崩溃信息时,发现很多地方莫明的出现空指针异常的错误,经过排查,发现可能就是static的问题。我们在项目中,将用户的信息也就是User对象保存成了一个静态变量,而在报错的地方,也都发现有使用过这种变量,因此,可以大致推断出与这种保存的方式有一定的联系。同时,有不少用户反映在打开应用的情况下,接个电话或者长时间待机后,再回到应用也会出现崩溃的现象,而这些崩溃都与静态变量的空指针有关系。
如此来说的话,static静态修饰在Android的开发中是不是很危险?或许我们可以说如果是static User u = new User();这样定义的话,那么应该不会有太大问题,而如果是static User u;这样定义的话,那么很可以会出现NULL的现象。当然,前面的方法里面的属性也可能会现空的情况,但是这个可以用封装来避免空指针。另外静态常量还是很好用的。
那么应该如何保存登录或者全局的信息呢?根据Google官方的推荐以及百度到的各位大神的推荐,我们应该尽量使用继承自Application的自定义类,在我们继承的类中定义需要全局使用的变量,并通过getApplicationContext()来获取和保存相关的变量即可。实例:

  1. package com.jony.bitmaptest;  
  2.   
  3. import android.app.Application;  
  4. import android.os.Handler;  
  5.   
  6. public class MyAplication extends Application{  
  7.     // 引发异常:在一些不规范的代码中经常看到Activity或者是Service当中定义许多静态成员属性。这样做可能会造成许多莫名其妙的null pointer异常。  
  8.       
  9.     // 异常分析:Java虚拟机的垃圾回收机制会主动回收没有被引用的对象或属性。在内存不足时,虚拟机会主动回收处于后台的Activity或Service所  
  10.     // 占用的内存。当应用再次去调用静态属性或对象的时候,就会造成null pointer异常  
  11.       
  12.     // 解决异常:Application在整个应用中,只要进程存在,Application的静态成员变量就不会被回收,不会造成null pointer异常  
  13.     private static final int MSG = 0X1;  
  14.     private Handler mHandler = new Handler(){  
  15.         public void handleMessage(android.os.Message msg) {  
  16.             switch (msg.what) {  
  17.                 case MSG:  
  18.                       
  19.                     break;  
  20.   
  21.                 default:  
  22.                     break;  
  23.             }  
  24.         };  
  25.     };  
  26.     private String action;  
  27.     private String username;  
  28.     private String password;  
  29.     @Override  
  30.     public void onCreate() {  
  31.         // TODO Auto-generated method stub  
  32.         super.onCreate();  
  33.     }  
  34.     public String getUsername() {  
  35.         return username;  
  36.     }  
  37.     public void setUsername(String username) {  
  38.         this.username = username;  
  39.     }  
  40.     public String getPassword() {  
  41.         return password;  
  42.     }  
  43.     public void setPassword(String password) {  
  44.         this.password = password;  
  45.     }  
  46.     public String getAction() {  
  47.         return action;  
  48.     }  
  49.     public void setAction(String action) {  
  50.         this.action = action;  
  51.     }  
  52.     public Handler getHandler(){  
  53.         return mHandler;  
  54.     }  
  55. }  
package com.jony.bitmaptest;

import android.app.Application;
import android.os.Handler;

public class MyAplication extends Application{
    // 引发异常:在一些不规范的代码中经常看到Activity或者是Service当中定义许多静态成员属性。这样做可能会造成许多莫名其妙的null pointer异常。

    // 异常分析:Java虚拟机的垃圾回收机制会主动回收没有被引用的对象或属性。在内存不足时,虚拟机会主动回收处于后台的Activity或Service所
    // 占用的内存。当应用再次去调用静态属性或对象的时候,就会造成null pointer异常

    // 解决异常:Application在整个应用中,只要进程存在,Application的静态成员变量就不会被回收,不会造成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中的使用方法:

  1. MyApplication application = (MyApplication) this.getApplicationContext();   
MyApplication application = (MyApplication) this.getApplicationContext(); 

Application是与应用同时存在的,也就是应用在它就在,并不会被GC给莫名其妙的回收掉,因此,使用此方法更加安全。

链接地址

http://www.2cto.com/kf/201205/133951.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值