單例物件的建立時機在第一次getInstance時
阿新 • • 發佈:2018-11-10
如題:單例物件的建立時機在第一次getInstance時
為說明此問題,摘錄工程中的一段程式碼如下:
/** * @className TimerUI * @description TODO 倒計時介面顯示類 * @author [email protected] * @date 2014-02-27 4:10:28 PM */ public class TimerUI { private static final String TAG = "TimerUI"; private static TimerUI mTimerUi = new TimerUI(); private static final int MSG_ANIM_END = 0; private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); } }; private TimerUI(){ Log.d(TAG, "TimerUI()"); } public static TimerUI getInstance(){ return mTimerUi; } }
雖然TimerUI的物件是static的。但並不是工程載入之初就建立其物件的。
而是第一次執行TimerUI.getInstance()。
之前在此的認識一直有誤區。
認為static變數mTimerUi在程式載入之處就建立。隨在Thread裡第一次執行了
getInstance()
而Handler是不可以在Thread裡面建立。最終報初始化錯誤:
java.lang.ExceptionInInitializerError
Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()