2017-02-06 1 views
0

У меня есть фрагмент, который сохраняет состояние через setRetainInstance(true). Это очень упрощенный код моего фрагмента:Фрагмент сохраненInstanceState не null после активности, убитого OS

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 не равно нулю. Таким образом, новый фрагмент пропускает инициализацию и пытается вызвать refresh(View) по нулевой ссылке.

Мой вопрос: Что будет содержать переменную savedInstanseState в методе onActivityCreated(savedInstanceState) в моем фрагменте кода, когда ОС убивает активность (когда приложение не на экране) и заново после возвращения?

ответ

0

Не уверен, что ответ полностью, но здесь это то, что я могу предположить

setRetainInstance (булевы сохранить) управления, является ли экземпляр фрагмента сохраняются через активность воссоздание (например, от конфигурации изменений). Это может использоваться только с фрагментами, не находящимися в задней части.

Так что я думаю, что когда вы сложите деятельность мнения разрушаться и данные экземпляра (значение setReetainInstance) сохраняется в пучке (делая savedInstanceState! = NULL при загрузке). Тем не менее, когда вы загружаете действие (поскольку ранее для параметра preserveInstance было установлено значение true) onCreate() не вызывается, а поскольку savedInstanceState! = Null и mData == null, вы получаете ошибку.

Смежные вопросы