安卓系统信息体制实际上就是指Handler的信息体制。

android源码怎么运行-android项目实例源码-第1张图片以上实体模型的表述:

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);}android源码怎么运行-android项目实例源码-第2张图片ThreadLocal怎样读取数据?

public T get() { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t);//会先依据当今进程寻找相应的ThreadLocalMap,要是没有就建立 if (map != null) { ThreadLocalMap.Entry e = map.getEntry(this); if (e != null) { @SuppressWarnings("unchecked") T result = (T)e.value; return result; } } return setInitialValue(); }//假如ThreadLocalMap 便会去建立ThreadLocalMap private T setInitialValue() { T value = initialValue(); Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); return value; }android源码怎么运行-android项目实例源码-第3张图片根据之前的编码,我们可以见到ThreadLocal是怎样确保数据储存后,仅有特定的进程才可以获得储存的数据信息,而别的进程没法读取数据的。

怎样确保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"); }android源码怎么运行-android项目实例源码-第4张图片//在上面的编码中,我们可以见到建立ActivityThread的looper . prepareinlooper();looper . loop();保证ActivityThread是主线任务程。

建立全局性唯一的Looper目标和全局性唯一的MessageQueue信息目标。

android源码怎么运行-android项目实例源码-第5张图片在运动中建立程序处理。

android源码怎么运行-android项目实例源码-第6张图片

android源码怎么运行-android项目实例源码-第7张图片信息推送

android源码怎么运行-android项目实例源码-第8张图片android源码怎么运行-android项目实例源码-第9张图片

信息解决信息资源管理

android源码怎么运行-android项目实例源码-第10张图片android源码怎么运行-android项目实例源码-第11张图片

信息堵塞和延迟时间。

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); } }android源码怎么运行-android项目实例源码-第12张图片而堵塞和延迟时间,关键是由于next()中的native problence(ptr,nextPollTimeoutMillis)启用孩子气的解决实际操作管路,由nextPollTimeoutMillis决策是不是堵塞。当nextpolltimeoutmillis为0时,表明无堵塞,当它为-1时,表明堵塞直至被唤起,别的时间表示延迟时间。

醒来时

关键就是指enqueueMessage()@MessageQueue唤起。

boolean enqueueMessage(Message msg, long when) { //在这儿唤起堵塞的方式 if (needWake) { nativeWake(mPtr); } }android源码怎么运行-android项目实例源码-第13张图片简易了解堵塞和唤起便是当主线任务程的MessageQueue中沒有信息时,在queue.next()的循环系统中堵塞nativePollOnce()方式。这时,主线任务程将释放出来CPU資源并进到休眠模式,直至下一条信息抵达或产生事务管理,并根据向管路的写端载入数据信息来唤起主线任务程。这儿选用的epoll体制是IO重复使用体制,能够与此同时监测好几个ioctl。当一个ioctl准备好(提前准备读或写)时,它会马上通告相对应的程序流程读或写,这本质上是同歩I/O,即读和写被堵塞。因而,主线任务程绝大多数時间处在休眠模式,不容易耗费很多的CPU資源。从堵塞到唤起,信息转换。

android源码怎么运行-android项目实例源码-第14张图片

延迟时间进到。

android源码怎么运行-android项目实例源码-第15张图片

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

评论(0条)

刀客源码 游客评论