保存在Application子类中的全局变量什么情况下会丢失?

wyd987100
  • 123

把从服务器接受的User类放到Application下,在某个Activity中就get不到了,是不是User信息不适合放在Application下?应该怎么存?

Update 追加对问题的描述

定义了一个public class App extends Application,在配置文件中设置好的初始化,里面放了一个UserBean的getter和setter方法,在‘A’-Activity中,用App.getUser().getxx没问题,跳转到'B'-Activity中,App.getUser()就出现了空指针。

回复
阅读 6.9k
3 个回答
li21
  • 3.1k
✓ 已被采纳

Android对Applicaton类做了如下描述

Base class for those who need to maintain global application state.

也就是说,我们可以继承该类以保存全局的“application state”。因为这些变量是全局的,所以应用的所有组件都可以获取/更改这些变量。链接

所以理论上,保存的全局变量在整个App的生命周期内是不会丢掉的,除非被程序主动改掉。
建议在整个工程中检查都是谁在引用Application子类中存储的这个全局变量,除了A-Activity和B-Activity之外? 或者你继承的Application类中,有没有在后来改到它?

如果还未解决,尝试使用单例模式,代替继承Application类以保存你的全局变量。

There is normally no need to subclass Application. In most situation, static singletons can provide the same functionality in a more modular way.

1,用接口定义全局变量

public interface UserInfo {
    
    String USER_NAME = "admin";
    String USER_PWD = "admin";
    }

引用 UserInfo.USER_NAME

2,用公开静态变量

public class UserInfo{
    public static String USER_NAME = "admin"; 
    public static String USER_PWD = "admin"; 
    }

引用 UserInfo.USER_NAME

3, 用Getter/Setter

public class UserBean {
    private static String UserName;
    private static String UserPwd;

    public static String getUserName() {
        return UserName;
    }

    public static void setUserName(String userName) {
        UserName = userName;
    }

    public static String getUserPwd() {
        return UserPwd;
    }

    public static void setUserPwd(String userPwd) {
        UserPwd = userPwd;
    }
}

使用 UserBean.setUserName / UserBean.getUserName

xmlspyspring
  • 3
新手上路,请多包涵

这个早就说过,不要在Application中放置全局对象. 当你把程序放置到后台,或者机器内存不够的时候,这些全局变量会被回收. 在Android中全局变量都要放置到数据库中或者Preferences中

宣传栏