static 修饰的是 静态变量,它的优点是 使用很方便,在不同的类和包中都可以使用,在虚拟机中单独占用内存。
不过使用 static 有一些不太好的地方:项目中 使用 static 的很多地方会莫明的出现空指针异常的错误,经过排查,可能就是static的问题。
如此来说,static 静态修饰在Android的开发中是不是很危险?或许我们可以说如果是static User u = new User();这样定义的话,那么应该不会有太大问题,而如果是static User u;这样定义的话,那么很可以会出现NULL的现象。当然,前面的方法里面的属性也可能会出现空的情况,但是这个可以用封装来避免空指针。另外静态常量还是很好用的。
Application是与应用同时存在的,也就是应用在它就在,并不会被GC给莫名其妙的回收掉,因此,使用此方法更加安全。
那么应该如何保存登录或者全局的信息呢?根据Google官方的推荐以及百度到的各位大神的推荐,我们应该尽量使用继承自Application的自定义类,在我们继承的类中定义需要全局使用的变量,并通过getApplicationContext()来获取和保存相关的变量即可。
首先,定义一个类,继承Application:
package com.chitty.base;
import android.app.Application;
/**
* 全局变量 保存 用户注册手机号
*/
public final class GlobalVaries extends Application {
// 引发异常:在一些不规范的代码中经常看到Activity或者是Service当中定义许多静态成员属性。这样做可能会造成许多莫名其妙的null pointer异常。
// 异常分析:Java虚拟机的垃圾回收机制会主动回收没有被引用的对象或属性。在内存不足时,虚拟机会主动回收处于后台的Activity或Service所
// 占用的内存。当应用再次去调用静态属性或对象的时候,就会造成null pointer异常
// 解决异常:Application在整个应用中,只要进程存在,Application的静态成员变量就不会被回收,不会造成null pointer异常
private String userphone;// 用户名手机号
private String userId;// 用户ID
@Override
public void onCreate() {
userphone = "";
userId = "";
super.onCreate();
}
public String getUserphone() {
return userphone;
}
public void setUserphone(String userphone) {
this.userphone = userphone;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
}
如何使用呢?接着看:
1、在设置数据的 页面 中:
在 onCreate() 方法里写:
private GlobalVaries globalUsername = (GlobalVaries) getApplication();
globalUsername.setUsername(username);
2、在接收数据的 页面 中:
// 若是Activity中,mContext可写为 this,或者直接省略;
// 此处是在 自定义的 PopupWindow中,故使用Context对象 mContext;
private GlobalVaries globalUsername = (GlobalVaries) mContext.getApplication();
String username = globalUsername.getUsername();
http://www.2cto.com/kf/201205/133951.html
http://blog.csdn.net/weihan1314/article/details/8033052