【发布时间】:2015-07-29 15:34:56
【问题描述】:
最近我遇到了一个难以重现的问题。 NPE 在片段尝试使用来自 Activity 的数据初始化 ArrayAdapter 时发生。 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);
}
当调用默认的 getCount() 方法时,NPE 发生在 AccountAdapter 内。原因是 mAccounts 为空。 这个问题很少出现,我无法重现它。
fragment 的 onCreate() 何时可能在活动的 onCreate() 之前被调用? 根据源码,Fragment的onCreate()是在Activity的onCreate()中调度的。为什么 Activity 的 onCreate() 执行完之后才调用呢?
【问题讨论】:
-
不,这是不可能的。
-
你应该发布更多关于你的片段如何在你的活动中显示的代码。
-
我同意@Ilya Vorobiev。当调用活动的 super.onCreate() 时,会分派 Fragment 的 onCreate()。问题是为什么在大多数情况下它是在 Activity 的 onCreate 之后执行的。
标签: android android-fragments android-lifecycle