Недавно я столкнулся с трудной проблемой. NPE возникает, когда фрагмент пытается инициализировать ArrayAdapter данными из Activity. Список по умолчанию, инициализированный в методе Activity onCreate:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ...
mAccounts = new ArrayList<>();
// ...
}
@Override
public List<Account> getAccounts(){
return mAccounts;
}
Фрагмент создает адаптер списка также в его onCreate():
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
setHasOptionsMenu(true);
//mAccountProvider is an interface implemented by the activity
mAccounts = mAccountProvider.getAccounts();
mAccountAdapter = new AccountAdapter(getActivity(), R.layout.account_list_item, mAccounts);
}
NPE возникает внутри AccountAdapter, когда вызывается метод getCount(). Причина в том, что mAccounts является нулевым. Проблема возникает редко, и я не смог ее воспроизвести.
Когда возможно, что фрагмент onCreate() вызывается перед активностью onCreate()? Согласно исходному коду, Fragment onCreate() отправляется в Activity onCreate(). Почему это вызвано после того, как Activity onCreate() завершила выполнение?