android - 为什么用new方法构造的Activity对象,其中的View成员变量是为空的?
巴扎黑
巴扎黑 2017-04-17 17:24:36
0
7
588

正如标题所言,View成员变量已经在Activity的onCreate方法中,通过findViewById方法初始化了。但在另一个类中,用通过new方法构造的Activity对象来执行封装好的公有方法时,发现其中的View成员变量是空的。具体代码如下(new MainActivity().select(selectCity)这句调用Activity的方法):

错误类型是

错误提示是指向下面这句

然后,调试结果如下

发现这里的View对象是为空的。然后,我换成发送广播的方式,让MainActivity接收广播,这样是可以的,调试结果如下:

发现mCityTextView不是空的。

对比上面的情况,我觉得通过findViewById方法初始化的View对象,只属于Activity这个类本身,所以由它使用是没问题的。但是通过new方法构造的Activity对象,得到的是没有初始化的View对象。所以究竟是怎么回事呢???

巴扎黑
巴扎黑

全部回覆(7)
刘奇

路子有點野。 new MainActivity()並沒有走Activity的生命週期,例如你都是在onCreate()裡初始化控制項的,你直接呼叫select()當然空指標了。

伊谢尔伦

Activity, Service, ContentProvider三大元件都不能以new的方式取得實例(「不正常的實例」會更恰當),Activity, Service, BroadcastReceiver, ContentProvider四大元件都存在生命週期,不建議在元件外呼叫定義的靜態變數或方法。

伊谢尔伦

不知道你說Activity是不是Android的Activity元件,其中Activity元件在建構的時候需要執行attach方法,傳入Context,Window等物件;View為空的原因我猜測是因為沒有attach Window物件;
Window物件是所有View的容器

PHPzhong

這並不是你想要的activity。
請傳遞該activity的引用。

巴扎黑

看程式碼裡面其實你自己在前面已經寫出來了getActivity()了,你把獲取到的這個Activity強轉成MainActivity就好了吧
直接new一個Activity是沒有走生命週期方法的,而且這也不是你之前的那個MainActivity

阿神

我這裡的問題是因為沒有為變數設定static,所以new物件出來,變數會為空,要重新初始化。呃,基本知識沒過關。 。但還是要感謝各位的解答! !

黄舟

這種情況用介面回呼的方式不是比較簡單嗎?

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板