在项目中由于历史原因将一些用户信息保存在了Application中,在切换用户时候就做置空等操作。
但是在新版本测试的过程中发现了问题。
首先,网上有很多文章会告诉你不要在Application中保存数据,因为Application会被回收,数据就相当于会被重置。
其次,在多进程访问应用时也会出现问题,我的问题就出现在app开启了一个service(从而开启了一个子进程),当主进程Application的变量更新时,service进程中的变量并没有更新。
例如:
class User{
int userId;
String userName;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
Application中有一个 static User user;如果在主进程中setUserName("A"),在Service中获取的userName仍然不是A,因为子进程持有的user并没有修改,在创建子进程的同时,Application中的变量也被复制了一份,而在此之后你只修改了主进程中的userName,service中的Application自然获取不到改变的变量了。有人说,我的service的onDestory已经回调了啊,为什么新创建的service还是没有copy更改过的userName,这时候你需要使用Process.myPid()来查看当前进程的id了,我的亲身经历是:新的service也建立在了上一个被销毁的service所在的子进程中。所以要区分好service和进程的概念呀。
Application中的变量不是跨进程的,但是Android设计了一个叫Intent的东西,这个东西你一定不陌生,这个是为数不多的可以携带数据穿梭于进程间的类,正常情况下,子进程中的数据的来源就应该是Intent,以免出错啦。
网友评论