Saurabh
Saurabh

Reputation: 350

What happens to static members of an Activity when it is recreated because of config changes

I want to create a static presenter object in my Activity, so that when the Activity is recreated because of config changes, it will retain the presenter instance and my business logic will not be affected.

The code of my Activity is:

    public class HomeActivity extends AppCompatActivity {

    public static HomePresenter presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        if (presenter == null){
            presenter = new HomePresenter();
        }
    }
}

Upvotes: 2

Views: 942

Answers (3)

thaussma
thaussma

Reputation: 9886

Nothing will happen to the static instance. But doing this could leak memory (see Avoiding memory leaks) if you do not delete the reference to the static presenter.

I would suggest another approach. Override onRetainNonConfigurationInstance() to keep an object when the Activity is destroyed because of an configuration change (e.g. rotation). And use getLastNonConfigurationInstance() to get the very same object after the configuration change.

 public class HomeActivity extends AppCompatActivity {

    public HomePresenter presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        presenter = (HomePresenter)getLastNonConfigurationInstance();
        if (presenter == null){
            presenter = new HomePresenter();
        }
    }

    @Override
    public Object onRetainNonConfigurationInstance() {
        return presenter;
    }
}

You can also use a Fragment to keep objects alive during a configuration change, see RetainingAnObject.

Upvotes: 1

David
David

Reputation: 16277

In short, the static object remains, and it gets its birth when you class is loaded into memory, and never goes away until your app dies, or when the class is unloaded.

In JVM languages, the compiler optimizes static fields by embedding the value in the bytecode instead of computing the value at runtime.

When you fire up a JVM and load a class for the first time (this is done by the classloader when the class is first referenced in any way) any static blocks or fields are 'loaded' into the JVM and become accessible.

enter image description here

So the static variable lives in the circle in the snapshot, and it is ignorant of whatever config changes, it is there, no matter what happens and as long as as the class is loaded.

Upvotes: 0

Mikhail Spitsin
Mikhail Spitsin

Reputation: 2608

Your code will work, presenter will be alive, but, please, don't do this.

Keyword 'static' means that value of this field will be attached to class, not to instance of it. So if you for example will have your HomeActivity, then you go to the SomeElseActivity and then go to new HomeActivity (you will have back stack HomeActivity -> SomeElseActivity -> HomeActivity) for new HomeActivity you will have same presenter as for old one. Thus you will have one share presenter for 2 independent instances of HomeActivity. Moreover, if you have some state in presenter, you will have a lot of problems with your application in this case.

I recommend you to remove 'static' keyword. And if your presenter have state, that's needed to be saved during config changes, try one of 2 alternatives:

1) Create onSaveInstanceState and onRestoreInstance state in your presenter and call them in appropriate activity's methods

2) Create fragment without ui, but with flag 'retain instace' (setRetainInstance method), and this fragment will keep reference to your presenter.

Upvotes: 0

Related Questions