簡體   English   中英

OS殺死活動后,片段savedInstanceState不為null

[英]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 當我折疊應用程序並在一段時間后返回時,會發生這種情況。

我有一些理論。 一段時間后,操作系統殺死了ActivityFragment (盡管setRetainInstance (true) )。 因此創建了我的片段的新對象,其中mDatanull初始化。 但是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM