Java object becomes eligible for GC when it is unreachable.
In java when does an object become unreachable?
So,
my question is, can this member variable be eligible for garbage collection at any moment between the Activity's onCreate and onDestory?
No
can this member variable mUser be garbage collected at all before my Activiy is completely destroyed
No
I use this member variable in my onResume. Should I check every time and see if it's null? Or that can never happen since I always instantiate it in my onCreate?
This can never happen, because you instantiated mUser in onCreate() and your Activity holds reference to it (and Activity object itself is obviously reachable object).
Simple example - storing Activity instance variable in external object:
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<>();
}
User:
public class User {
private String name;
public User(String name) {
this.name = name;
}
}
Log (run app and rotate screen twice):
<!-- 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
As we can see, while Activity is destroyed, mUser object is still alive because it is referenced in UserHolder.mUsers object.