[英]Fragment savedInstanceState not null after activity killed by OS
我有一個片段,它通過setRetainInstance(true)
保存狀態。 這是我的片段的非常簡化的代碼:
public class MyFragment extends Fragment {
private SomeData mData;
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
if (savedInstanceState == null) {
mData = new SomeData(getView());
} else {
mData.refresh(getView());
}
// More awesome code
}
}
}
有時,應用程序崩潰並顯示NullPointerException
我的mData
突然變為null
。 當我折疊應用程序並在一段時間后返回時,會發生這種情況。
我有一些理論。 一段時間后,操作系統殺死了Activity
和Fragment
(盡管setRetainInstance (true)
)。 因此創建了我的片段的新對象,其中mData
由null
初始化。 但是savedInstanseState
不等於null。 因此,新片段將跳過初始化,並嘗試在null引用上調用refresh(View)
。
我的問題:當操作系統onActivityCreated(savedInstanceState)
活動(當應用程序不在屏幕上時)並在返回后重新創建時,我的代碼片段中的onActivityCreated(savedInstanceState)
方法中的savedInstanseState
變量將包含什么?
不能完全確定答案,但這是我能猜到的
setRetainInstance(布爾值保留)控制是否在Activity重新創建期間保留片段實例(例如,從配置更改中保留)。 這只能與不在后堆棧中的片段一起使用。
所以我認為,當您折疊活動時,視圖將被破壞,實例數據(setReetainInstance值)被保存在捆綁包中(在加載時使saveInstanceState!= null)。 但是,當您加載活動時(因為之前將keepInstance設置為true),onCreate()不會被調用,並且由於saveInstanceState!= null和mData == null會導致錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.