Activity的成员变量什么时候有资格进行垃圾回收?

时间:2015-11-26 18:47:43

标签: android garbage-collection

我的Activity中有一个成员变量 mUser ,我实例化并在onCreate方法中赋值,并将其放在我的Activity之外的HashMap中。在配置更改后重新创建Activity时,我从提到的HashMap中获取mUser。

现在,我的问题是,这个成员变量是否可以在Activity的onCreate和onDestory之间的任何时刻进行垃圾收集?或者更一般的问题,在我的Activiy被完全销毁之前,这个成员变量 mUser 是否可以被垃圾收集?

我在onResume中使用这个成员变量。我应该每次检查一下,看看它是否为空?或者这永远不会发生,因为我总是在我的onCreate中实例化它?

谢谢。

1 个答案:

答案 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对象中被引用。