问题描述
App切换到后台后,一段时间不操作,再切回来,很容易就发生崩溃(配置低的手机这种问题出现更频繁)。究其原因,是因为常常把对象存储在Application里面,而App切换到后台后,进程很容易就被系统回收了,下次切换回来的时候App页面再重建,但是系统重建的App对于原来存储的全局变量却无能为力。
示例工程
例如:有这样的场景,在App登陆页面登录成功后,把接口返回的用户信息(用户名,电话,服务器返回用于后续网络请求的口令-Token)存储起来,方便下次使用。
1.创建存储用户信息的UserInfoBean
/** 用户信息 */
public class UserInfoBean {
private String name;
private String tel;
private String token;
public UserInfoBean(String name, String tel, String token) {
super();
this.name = name;
this.tel = tel;
this.token = token;
}
@Override
public String toString() {
return "UserInfoBean [name=" + name + ", tel=" + tel + ", token="
+ token + "]";
}
}
2.因为很多页面都有可能会设计到使用网络访问,获取用户信息,于是把它存储到Application中。
public class XApp extends Application {
private UserInfoBean userinfo;
public UserInfoBean getUserinfo() {
return userinfo;
}
public void setUserinfo(UserInfoBean userinfo) {
this.userinfo = userinfo;
}
}
3.模拟登录成功,存储接口返回的UserInfoBean
public class LoginActivity extends Activity {
private Button btnLogin;
private ProgressDialog pdLogin;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
pdLogin = new ProgressDialog(this, ProgressDialog.THEME_HOLO_LIGHT);
pdLogin.setMessage("登陆中...");
btnLogin = (Button) findViewById(R.id.btnLogin);
btnLogin.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 弹出等待对话框 模拟登录耗时操作
pdLogin.show();
btnLogin.getHandler().postDelayed(new Runnable() {
@Override
public void run() {
pdLogin.dismiss();
// 存储数据
UserInfoBean userInfo = new UserInfoBean("Tony",
"17011110000", "tokenabcdefg");
((XApp) getApplication()).setUserinfo(userInfo);
MainActivity.actionStart(LoginActivity.this);
}
}, 1500);
}