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