publicstaticvoidprepareMainLooper(){prepare(false);synchronized(Looper.class){if(sMainLooper !=null){thrownewIllegalStateException("The main Looper has already been prepared.");}
sMainLooper =myLooper();}}
privatestaticvoidprepare(boolean quitAllowed){if(sThreadLocal.get()!=null){//此处是为了确保主线程的ThreadLocalMap是没有保存Looper类的静态常量属性sThreadLocal和Looper对象的thrownewRuntimeException("Only one Looper may be created per thread");}
sThreadLocal.set(newLooper(quitAllowed));//此时此处调用,传入了false}
publicTget(){Thread t =Thread.currentThread();ThreadLocalMap map =getMap(t);if(map !=null){ThreadLocalMap.Entry e = map.getEntry(this);if(e !=null){@SuppressWarnings("unchecked")T result =(T)e.value;return result;}}returnsetInitialValue();}
//ThreadLocal.ThreadLocalMap的内部静态类,可以看出,此处是对ThreadLocal的弱引用结构staticclassEntryextendsWeakReference<ThreadLocal<?>>{/** The value associated with this ThreadLocal. */Object value;Entry(ThreadLocal<?> k,Object v){super(k);
value = v;}}privateEntry[] table;//ThreadLocal.ThreadLocalMap的私有属性
privatestaticvoidprepare(boolean quitAllowed){if(sThreadLocal.get()!=null){//此处是为了确保主线程的Looper是sThreadLocal的第一个元素thrownewRuntimeException("Only one Looper may be created per thread");}
sThreadLocal.set(newLooper(quitAllowed));//此时此处调用,传入了false}
ThreadLocal的get()方法,我们上面分析了,我们来分析一下set()方法
publicvoidset(T value){Thread t =Thread.currentThread();ThreadLocalMap map =getMap(t);if(map !=null)
map.set(this, value);elsecreateMap(t, value);}