Android setRetainInstance(true)不会持久化片段的成员变量

Android setRetainInstance(true)不会持久化片段的成员变量,android,android-fragments,Android,Android Fragments,我正在使用一个无视图片段来存储活动方向更改期间的一些数据。大致如下: public class BoardActivity extends BaseActivity { private DataHandler mDataHandler; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // in

我正在使用一个无视图片段来存储活动方向更改期间的一些数据。大致如下:

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);
        }
    }
}
发生的情况是,当活动离开(例如home按钮)并且由于某种原因在后台被终止时,应用程序在重新启动该活动时崩溃。原因是,尽管FragmentManager找到了片段
mDataHandler
,但其成员变量(
mThreads
)为
null

为什么片段本身可以保留,但其变量设置为零

为什么片段本身可以保留,但其变量设置为零

碎片没有被保留。保留的片段仅用于配置更改。您没有经历配置更改。您的进程被终止,因为Android需要RAM来支持其他应用程序

为什么片段本身可以保留,但其变量设置为零


碎片没有被保留。保留的片段仅用于配置更改。您没有经历配置更改。您的进程被终止,因为Android需要RAM来支持其他应用程序。

我以为这不是真的?我的意思是,如果堆栈中打开了5个活动,Android不会终止它们以释放ram。我在这里错了吗?那么当我从FragmentManager获得它时,
mDataHandler
为什么不为空?这正是我检查的原因。@Lefteris:“如果堆栈中有5个活动打开,Android不会终止它们以释放ram。我错了吗?”——设备没有无限的ram。Android将倾向于清除空的进程(例如,所有活动都是
finish()
-ed),但最终将不得不开始终止有正在运行的活动的进程。@janoliver:“那么,当我从FragmentManager获得mDataHandler时,为什么mDataHandler不为null?”--我猜您是通过最近的任务列表返回应用程序的。在这种情况下,Android可能仍然具有已保存的实例状态(
Bundle
onSaveInstanceState()
),因此可能会重新创建先前活动中存在的片段。然而,由于它终止了进程,它无法保留片段,这就是为什么片段本身是相对空的。这是有道理的。但是,在我的应用程序崩溃之前,不会调用任何
onRestoreInstanceState()。。。什么是最好的解决方案?我已经做的方式似乎不太好。我以为这不是真的?我的意思是,如果堆栈中打开了5个活动,Android不会终止它们以释放ram。我在这里错了吗?那么当我从FragmentManager获得它时,
mDataHandler
为什么不为空?这正是我检查的原因。@Lefteris:“如果堆栈中有5个活动打开,Android不会终止它们以释放ram。我错了吗?”——设备没有无限的ram。Android将倾向于清除空的进程(例如,所有活动都是
finish()
-ed),但最终将不得不开始终止有正在运行的活动的进程。@janoliver:“那么,当我从FragmentManager获得mDataHandler时,为什么mDataHandler不为null?”--我猜您是通过最近的任务列表返回应用程序的。在这种情况下,Android可能仍然具有已保存的实例状态(
Bundle
onSaveInstanceState()
),因此可能会重新创建先前活动中存在的片段。然而,由于它终止了进程,它无法保留片段,这就是为什么片段本身是相对空的。这是有道理的。但是,在我的应用程序崩溃之前,不会调用任何
onRestoreInstanceState()。。。什么是最好的解决方案?我已经这样做了,看起来不太好。