如何解决为什么在 onCreate() 方法中初始化数组适配器很重要?
ArrayAdapter<String> bigSquash = new ArrayAdapter<String>(this,R.layout.adapter_xml,onPointString);
每当我在 onCreate() 方法之外初始化这个数组适配器时都会产生一个错误,而当我在 onCreate() 方法中初始化它时不会抛出错误。 谁能告诉我为什么会这样?
解决方法
LayoutInflater.from(context) 会在ArrayAdapter的构造函数中被调用如果activity没有onCreate,就会跑出异常,
ArrayAdapter 构造函数代码
private ArrayAdapter(@NonNull Context context,@LayoutRes int resource,@IdRes int textViewResourceId,@NonNull List<T> objects,boolean objsFromResources) {
mContext = context;
mInflater = LayoutInflater.from(context);
mResource = mDropDownResource = resource;
mObjects = objects;
mObjectsFromResources = objsFromResources;
mFieldId = textViewResourceId;
}
LayoutInflater.from 代码
public static LayoutInflater from(Context context) {
LayoutInflater LayoutInflater =
(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (LayoutInflater == null) {
throw new AssertionError("LayoutInflater not found.");
}
return LayoutInflater;
}
activity.getSystemService 代码
@Override
public Object getSystemService(@ServiceName @NonNull String name) {
if (getBaseContext() == null) {
throw new IllegalStateException(
"System services not available to Activities before onCreate()");
}
if (WINDOW_SERVICE.equals(name)) {
return mWindowManager;
} else if (SEARCH_SERVICE.equals(name)) {
ensureSearchManager();
return mSearchManager;
}
return super.getSystemService(name);
}
所以你需要在活动之后调用onCreate。
,这个和Activity父类ContextWrapper的变量mBase的初始化有关
Activity 启动过程
ActivityThread.performLaunchActivity -> Activity.attach -> Activity.attachBaseContext -> ContextThemeWrapper.attachBaseContext -> ContextWrapper.attachBaseContext -> ContextWrapper.mBase init
Activity 的 onCreate() 方法会在 attach() 之后调用
如果在mBase初始化之前调用Activity的getSystemService(),会发生异常,因为mBase变量为空
new ArrayAdapter(activity) -> LayoutInflater.from(context) -> Activity.getSystemService -> Activity.getBaseContext is null throw IllegalStateException
如果需要更详细的信息,请查看Activity的启动过程
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。