Kürzlich stieß ich auf ein schwer reproduzierbares Problem. Der NPE tritt auf, wenn ein Fragment versucht, ArrayAdapter mit den Daten von Activity zu initialisieren. Die Standardliste in Aktivität des onCreate Methode initialisiert:Warum Fragment onCreate() wird manchmal vor Activity onCreate() aufgerufen?
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ...
mAccounts = new ArrayList<>();
// ...
}
@Override
public List<Account> getAccounts(){
return mAccounts;
}
Das Fragment erstellt eine Liste Adapter auch in seiner 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);
}
Die NPE tritt innerhalb des AccountAdapter wenn Standard getCount() Methode wird aufgerufen. Der Grund ist, dass mAcocounts null ist. Das Problem tritt selten auf und ich konnte es nicht reproduzieren.
Wann ist es möglich, dass das Fragment onCreate() vor onCreate Aktivität() genannt wird? Nach dem Quellcode wird Fragments onCreate() in der Aktivität onCreate() gesendet. Warum wird es aufgerufen, nachdem Activity onCreate() seine Ausführung beendet hat?
nein es ist nicht möglich. – Blackbelt
Sie sollten mehr Code darüber veröffentlichen, wie Ihr Fragment in Ihrer Aktivität angezeigt wird. – jobcrazy
Ich stimme @Ilya Vorobiev zu. Das onCreate() des Fragments wird ausgelöst, wenn super.onCreate() der Aktivität aufgerufen wird. Die Frage ist, warum es in den meisten Fällen nach dem onCreate der Aktivität ausgeführt wird. – Zzokk