首先要知道Looper中有壹個sThreadLocal變量,ThreadLocal用於存儲上下文信息
並且用final static 修飾,所以它是唯壹的內容不可變的
了解sThreadLocal是幹啥用的後,再來看看prepare
先調用sThreadLocal.get()方法
而ThreadLocalMap 是壹個HashMap,那麽取到壹個HashMap後判斷是否為null
如果不存在key為sThreadLocal的節點,得到value = null,並把這個value作為sThreadLocal的值即<sThreadLocal,null>;如果map為null,則創建壹個HashMap並把<sThreadLocal,null>節點加入
這樣get方法就要麽取到壹個Looper,要麽就是null,如果為Looper則拋異常,如果為null,則調用sThreadLocal.set()
其實都是把Looper作為sThreadLocal的value值
回到開頭說的,怎麽保證壹個線程只有壹個Looper?
因為sThreadLocal是線程的上下文,並且唯壹,而線程中存有<sThreadLocal,Looper>key-value鍵值對,所以壹個sThreadLocal對應壹個Looper,並且再次修改Looper是,會拋異常,因為Looper已經存在。
所以壹個線程只有壹個Looper。
如果對HashMap還不了解的同學,這篇文章可能對妳有壹定幫助 HashMap原理