本文由 发布,转载请注明出处,如有问题请联系我们! 发布时间: 2021-08-01android源码怎么运行-android项目实例源码
加载中安卓系统信息体制实际上就是指Handler的信息体制。

1.以Handler的sendmail方式为例子,推送信息后,信息会被加入到MessageQueue中。
2.Looper承担解析xml线程池,并将序列中的信息派发到合适的Handler开展解决。
3.在Handler的handleMessage方式中解决信息,该方式完成了推送和解决信息的全过程。从图上能够看得出,信息解决涉及到四个目标,分别是Handler,message,MessageQueue和Looper。
ThreadLocal是进程內部的数据储存类,根据它还可以将数据储存在规定的进程中。数据储存后,仅有特定的进程才可以获得储存的数据信息,别的进程没法读取数据。
使我们看一下ThreadLocal是怎样储存数据信息的:
public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value);}在源代码里边我们可以看得出 ThreadLocal在储存数据信息的情况下,会先取得当今进程,随后按照当今进程会获得一个称为ThreadLocalMap 的Map二维数组;什么叫进程当地投射?
我们可以见到,在CreateMap中,大家使用了ThreadLocalMap,并将当今进程做为Key,传送的Value便是大家根据启用ThreadLocal.set(T)传送的值。
void createMap(Thread t, T firstValue) { t.threadLocals = new ThreadLocalMap(this, firstValue);}

怎样确保Acticity的默认设置进程是主线任务程?
事实上,大家采用的进程是ActivityThread,它在进程的。
main(String[] args)方式里边我们可以见到下边编码 public static void main(String[] args) { Looper.prepareMainLooper(); ActivityThread thread = new ActivityThread(); thread.attach(false, startSeq); if (sMainThreadHandler == null) { sMainThreadHandler = thread.getHandler(); } if (false) { Looper.myLooper().setMessageLogging(new LogPrinter(Log.DEBUG, "ActivityThread")); } Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); Looper.loop(); throw new RuntimeException("Main thread loop unexpectedly exited"); }
建立全局性唯一的Looper目标和全局性唯一的MessageQueue信息目标。





信息解决信息资源管理


信息堵塞和延迟时间。
Looper关键被MessageQueue堵塞,在next () @ messagequest堵塞,在enqueueMessage()@MessageQueue唤起。Looper关键依靠于原生层,取决于epoll体制。
Message next() { int pendingIdleHandlerCount = -1; // -1 only during first iteration int nextPollTimeoutMillis = 0; for (;;) { if (nextPollTimeoutMillis != 0) { Binder.flushPendingCommands(); }//堵塞和延迟,主要是next()中nativePollOnce(ptr, nextPollTimeoutMillis)启用naive方式实际操作管路 nativePollOnce(ptr, nextPollTimeoutMillis); } }
醒来时
关键就是指enqueueMessage()@MessageQueue唤起。
boolean enqueueMessage(Message msg, long when) { //在这儿唤起堵塞的方式 if (needWake) { nativeWake(mPtr); } }

延迟时间进到。

关键就是指enqueueMessage()线程池,这代表着图中中的工作经验对信息目标池开展了再次排列,并遵循标准(由小到大)。这儿,for循环以二种方法中的第一种撤出:p==null表明目标池中的最后一个循环系统早已运作,因而不用回收利用。第二,时下一条信息低于前一条信息时,循环系统会马上被发布(不管目标池中的任何信息是不是早已被解析xml)并再次排列。