android - 為什么用new方法構造的Activity對象,其中的View成員變量是為空的?
問題描述
正如標題所言,View成員變量已經在Activity的onCreate方法中,通過findViewById方法初始化了。但在另一個類中,用通過new方法構造的Activity對象來執行封裝好的公有方法時,發現其中的View成員變量是空的。具體代碼如下(new MainActivity().select(selectCity)這句調用Activity的方法):
錯誤類型是
錯誤提示是指向下面這句
然后,調試結果如下
發現這里的View對象是為空的。然后,我換成發送廣播的方式,讓MainActivity接收廣播,這樣是可以的,調試結果如下:發現mCityTextView不是空的。
對比上面的情況,我覺得通過findViewById方法初始化的View對象,只屬于Activity這個類本身,所以由它使用是沒問題的。但是通過new方法構造的Activity對象,得到的是沒有初始化的View對象。所以究竟是怎么回事呢???
問題解答
回答1:路子有點野。new MainActivity()并沒有走Activity的生命周期,比如你都是在onCreate()里初始化控件的,你直接調用select()當然空指針了。
回答2:Activity, Service, ContentProvider三大組件都不能以new的方式獲取實例(“不正常的實例”會更恰當),Activity, Service, BroadcastReceiver, ContentProvider四大組件都存在生命周期,不建議在組件外調用定義的靜態變量或方法。
回答3:不知道你說Activity是不是Android的Activity組件,其中Activity組件在構造的時候需要執行attach方法,傳入Context,Window等對象;View為空的原因我猜測是因為沒有attach Window對象;Window對象是所有View的容器
回答4:這并不是你想要的activity。請傳遞該activity的引用。
回答5:看代碼里面其實你自己在前面已經寫出來了getActivity()了,你把獲取到的這個Activity強轉成MainActivity就好了吧直接new一個Activity是沒有走生命周期方法的,并且這也不是你之前的那個MainActivity
回答6:我這里的問題是因為沒有為變量設置static,所以new對象出來,變量會為空,要重新初始化。呃,基本知識沒過關。。但還是要感謝各位的解答!!
回答7:這種情況用接口回調的方式不是更簡單嗎?
