Why getApplicationContext() in constructor of Activity throws null pointer exception?

后端 未结 2 1902
慢半拍i
慢半拍i 2020-11-28 16:51

After some time spent bug hunting it turns out that :

public class MainActivity extends BaseActivity { // BaseActivity extends Activity

    public MainActi         


        
相关标签:
2条回答
  • 2020-11-28 17:15

    Wait for the end of onCreate to call this method.

    public class MainActivity extends BaseActivity { 
    
        public onCreate(Bundle savedInstanceState) {
            super(savedInstanceState);
            getApplicationContext(); //activity has a context now
        }
    }
    
    0 讨论(0)
  • 2020-11-28 17:18

    Just to get a feeling of what's going on. Activity extends ContextThemeWrapper which extends ContextWrapper from whom Activity inherits getApplicationContext(). ContextWrapper implements it as :

    @Override
    public Context  getApplicationContext() {
        return mBase.getApplicationContext(); // mBase is a Context
    }
    

    The only public constructor of ContextWrapper is :

     public  ContextWrapper(Context base) {
         mBase = base;
     } 
    

    in ContextThemeWrapper we have :

     public  ContextThemeWrapper() {
         super(null);
     }
    

    and since Activity does not define an explicit constructor the constructor above is called - mBase == null in Activity's constructor - boom.

    Links from 4.2.2_r1

    0 讨论(0)
提交回复
热议问题