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()。。。什么是最好的解决方案?我已经这样做了,看起来不太好。