janoliver
janoliver

Reputation: 7824

setRetainInstance(true) does not persist member variables of the Fragment

I am using a View-less Fragment to store some data during orientation change of my Activity. It looks roughly like this:

public class BoardActivity extends BaseActivity {
    private DataHandler mDataHandler;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // initialize the data handler
        mDataHandler = (DataHandler)mFragmentManager.findFragmentByTag("data");
        if (mDataHandler == null) {
            mDataHandler = new DataHandler();
            mFragmentManager.beginTransaction().add(mDataHandler, "data").commit();

            // initialize the data
            mDataHandler.mThreads = ...;
        } else {

            // here, the data is taken and the ListView is filled again.
            fillView();
        }
    }

    public static class DataHandler extends Fragment {
        private Topic[] mThreads;

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setRetainInstance(true);
        }
    }
}

What happens is, that when the Activity is left (vor example with the home button) and for some reason is killed in the background, the app crashes upon restart of that Activity. The reason is that although the Fragment mDataHandler is found by the FragmentManager, its Member variable (mThreads) is null.

How come the Fragment itself can be retained but its variables are set to zero?

Upvotes: 1

Views: 1153

Answers (1)

CommonsWare
CommonsWare

Reputation: 1006779

How come the Fragment itself can be retained but its variables are set to zero?

The fragment was not retained. Retained fragments are retained only for configuration changes. You did not go through a configuration change. Your process was terminated, because Android needed the RAM to support other apps.

Upvotes: 1

Related Questions