我的Activity中有一个成员变量 mUser ,我实例化并在onCreate方法中赋值,并将其放在我的Activity之外的HashMap中。在配置更改后重新创建Activity时,我从提到的HashMap中获取mUser。
现在,我的问题是,这个成员变量是否可以在Activity的onCreate和onDestory之间的任何时刻进行垃圾收集?或者更一般的问题,在我的Activiy被完全销毁之前,这个成员变量 mUser 是否可以被垃圾收集?
我在onResume中使用这个成员变量。我应该每次检查一下,看看它是否为空?或者这永远不会发生,因为我总是在我的onCreate中实例化它?
谢谢。
答案 0 :(得分:3)
当Java对象无法访问时,它将符合GC的条件。
In java when does an object become unreachable?
所以,
我的问题是,这个成员变量是否可以在Activity的onCreate和onDestory之间的任何时刻进行垃圾收集?
没有
在我的Activiy被完全销毁之前,这个成员变量mUser可以被垃圾收集
没有
我在onResume中使用这个成员变量。我应该每次检查一下,看看它是否为空?或者这永远不会发生,因为我总是在我的onCreate中实例化它?
这种情况永远不会发生,因为你在onCreate()中实例化了mUser,而你的Activity保存了对它的引用(而Activity对象本身显然是可以访问的对象)。
简单示例 - 将Activity实例变量存储在外部对象中:
MainActivity:
public class MainActivity extends AppCompatActivity {
public static final String LOG_TAG = "activity_var";
private User mUser;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(LOG_TAG, "onCreate");
Log.d(LOG_TAG, "mUser: " + mUser);
Log.d(LOG_TAG, "UserHolder.mUsers: " + UserHolder.mUsers);
mUser = new User("Max");
Log.d(LOG_TAG, "Created new mUser: " + mUser);
UserHolder.mUsers.add(mUser);
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(LOG_TAG, "onDestroy");
}
}
UserHolder:
public class UserHolder {
public static List<User> mUsers = new ArrayList<>();
}
用户:
public class User {
private String name;
public User(String name) {
this.name = name;
}
}
记录(运行应用程序并旋转屏幕两次):
<!-- language: lang-none -->
onCreate
Activity's mUser: null
UserHolder.mUsers: []
Created new mUser: ru.max77.test.User@2e393fa5
onDestroy
// Screen rotation
onCreate
Activity's mUser: null
UserHolder.mUsers: [ru.max77.test.User@2e393fa5]
Created new mUser: ru.max77.test.User@250388f5
onDestroy
// Screen rotation
onCreate
Activity's mUser: null
UserHolder.mUsers: [ru.max77.test.User@2e393fa5, ru.max77.test.User@250388f5]
Created new mUser: ru.max77.test.User@be9af24
正如我们所看到的,当Activity被销毁时,mUser对象仍处于活动状态,因为它在UserHolder.mUsers对象中被引用。