バグハンティングにしばらく時間を費やした後、次のことが判明しました。
public class MainActivity extends BaseActivity { // BaseActivity extends Activity
public MainActivity() {
super();
getApplicationContext(); // NPE here
}
}
なんで ?これはどこに文書化されていますか?
フロヨ
バグハンティングにしばらく時間を費やした後、次のことが判明しました。
public class MainActivity extends BaseActivity { // BaseActivity extends Activity
public MainActivity() {
super();
getApplicationContext(); // NPE here
}
}
なんで ?これはどこに文書化されていますか?
フロヨ
何が起こっているのかを感じるだけです。Activity は、Activityが継承するContextWrapperを拡張するContextThemeWrapperを拡張します。ContextWrapperは次のように実装します。getApplicationContext()
@Override
public Context getApplicationContext() {
return mBase.getApplicationContext(); // mBase is a Context
}
の唯一の公開コンストラクタは次のContextWrapper
とおりです。
public ContextWrapper(Context base) {
mBase = base;
}
ContextThemeWrapper
私たちは持っています:
public ContextThemeWrapper() {
super(null);
}
Activityは明示的なコンストラクターを定義していないため、上記のコンストラクターは (Activity のコンストラクターで) ブームと呼ばれますmBase == null
。
からのリンク4.2.2_r1
onCreate
がこのメソッドを呼び出すのを待ちます。
public class MainActivity extends BaseActivity {
public onCreate(Bundle savedInstanceState) {
super(savedInstanceState);
getApplicationContext(); //activity has a context now
}
}