Recentemente mi sono imbattuto in un problema difficile da riprodurre. L'NPE si verifica quando un frammento tenta di inizializzare ArrayAdapter con i dati di Activity. L'elenco predefinito inizializzata nel metodo onCreate di attività:Why Fragment's onCreate() viene talvolta chiamato prima di onCreate() di Activity?
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ...
mAccounts = new ArrayList<>();
// ...
}
@Override
public List<Account> getAccounts(){
return mAccounts;
}
Il frammento crea un adattatore lista anche nella sua 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);
}
La NPE avviene all'interno del AccountAdapter quando predefinita Il metodo getCount() viene chiamato. Il motivo è che mAccounts è null. Il problema appare raramente e non sono stato in grado di riprodurlo.
Quando è possibile che del frammento onCreate() viene chiamato prima onCreate di attività()? In base al codice sorgente, Framment's onCreate() viene inviato nell'attività onCreate(). Perché viene poi chiamato dopo che Activity onCreate() ha terminato la sua esecuzione?
no, non è possibile. – Blackbelt
Dovresti pubblicare più codice su come il tuo frammento viene mostrato nella tua attività. – jobcrazy
Sono d'accordo con @Ilya Vorobiev. Il frammento di onCreate() viene inviato quando viene chiamato super.onCreate() dell'attività. La domanda è: perché nella maggior parte dei casi viene eseguita dopo l'attività su onCreate. – Zzokk