为什么ArrayAdapter需在onCreate()方法内初始化,外部初始化会报错?
ArrayAdapter初始化位置异常原因
先给两种写法对照:
错误写法(成员变量直接初始化)
public class TestActivity extends AppCompatActivity { // onCreate外直接初始化ArrayAdapter ArrayAdapter<String> bigSquash = new ArrayAdapter<String>(this, R.layout.adapter_xml, onPointString); private List<String> onPointString = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test); } }
正确写法(onCreate内初始化)
public class TestActivity extends AppCompatActivity { ArrayAdapter<String> bigSquash; private List<String> onPointString = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test); // onCreate内初始化ArrayAdapter bigSquash = new ArrayAdapter<String>(this, R.layout.adapter_xml, onPointString); } }
异常根本原因
- 核心问题是 Context 上下文的有效性:ArrayAdapter 构造方法第一个参数需要传入可用的 Context,用来加载布局资源、读取应用配置。
- 放在 onCreate 外部初始化时,Activity 类刚完成实例化,还没有经过 Android 系统的生命周期绑定流程,此时的
this指向的 Activity 实例还没有挂载可用的 Context,无法提供资源访问能力,ArrayAdapter 初始化时需要读取R.layout.adapter_xml布局,就会抛出资源加载失败的异常。 - 放在 onCreate 内部初始化时,
super.onCreate(savedInstanceState)已经执行完毕,系统已经为当前 Activity 绑定了有效的 Context,此时传入的this可以正常提供资源服务,所以初始化流程可以正常执行。
内容的提问来源于stack exchange,提问作者Tom Shaw
相关产品推荐
相关产品推荐

