当前位置: 首页 > wzjs >正文

网站外链发布平台排名检测

网站外链发布平台,排名检测,做企业网站怎么样,软件开发流程图名称ANR的原理是进行了超时告警,在执行一个需要被监控的任务时,注册一个超时提醒,如果很快执行好了,删除这个提醒,如果超时,这个提醒就被触发,这个超时处理是通过handler方式来调用的,这…

ANR的原理是进行了超时告警,在执行一个需要被监控的任务时,注册一个超时提醒,如果很快执行好了,删除这个提醒,如果超时,这个提醒就被触发,这个超时处理是通过handler方式来调用的,这里我们来关注一个细节,任务在执行,超时处理显然应该是在另外一个线程里来进行监控的。这是显而易见的,这里我们就通过广播里的ANR处理来查看这个显而易见的线程问题,

在广播发送过程中,会调用到AMS中的

ActivityManagerService.java - Android社区 - https://www.androidos.net.cn/

            synchronized(this) {BroadcastQueue queue = (flags & Intent.FLAG_RECEIVER_FOREGROUND) != 0? mFgBroadcastQueue : mBgBroadcastQueue;r = queue.getMatchingOrderedReceiver(who);if (r != null) {doNext = r.queue.finishReceiverLocked(r, resultCode,resultData, resultExtras, resultAbort, true);}if (doNext) {r.queue.processNextBroadcastLocked(/*fromMsg=*/ false, /*skipOomAdj=*/ true);}

这是AMS中的一个线程,调用了BroadcastQueue中的processNextBroadcastLocked

https://www.androidos.net.cn/android/9.0.0_r8/xref/frameworks/base/services/core/java/com/android/server/am/BroadcastQueue.java

    final void processNextBroadcastLocked(boolean fromMsg, boolean skipOomAdj) {BroadcastRecord r;if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST, "processNextBroadcast ["+ mQueueName + "]: "+ mParallelBroadcasts.size() + " parallel broadcasts, "+ mOrderedBroadcasts.size() + " ordered broadcasts");mService.updateCpuStats();if (fromMsg) {mBroadcastsScheduled = false;}// First, deliver any non-serialized broadcasts right away.while (mParallelBroadcasts.size() > 0) {r = mParallelBroadcasts.remove(0);r.dispatchTime = SystemClock.uptimeMillis();r.dispatchClockTime = System.currentTimeMillis();if (Trace.isTagEnabled(Trace.TRACE_TAG_ACTIVITY_MANAGER)) {Trace.asyncTraceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER,createBroadcastTraceTitle(r, BroadcastRecord.DELIVERY_PENDING),System.identityHashCode(r));Trace.asyncTraceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,createBroadcastTraceTitle(r, BroadcastRecord.DELIVERY_DELIVERED),System.identityHashCode(r));}final int N = r.receivers.size();if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG_BROADCAST, "Processing parallel broadcast ["+ mQueueName + "] " + r);for (int i=0; i<N; i++) {Object target = r.receivers.get(i);if (DEBUG_BROADCAST)  Slog.v(TAG_BROADCAST,"Delivering non-ordered on [" + mQueueName + "] to registered "+ target + ": " + r);deliverToRegisteredReceiverLocked(r, (BroadcastFilter)target, false, i);}addBroadcastToHistoryLocked(r);if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG_BROADCAST, "Done with parallel broadcast ["+ mQueueName + "] " + r);}// Now take care of the next serialized one...// If we are waiting for a process to come up to handle the next// broadcast, then do nothing at this point.  Just in case, we// check that the process we're waiting for still exists.if (mPendingBroadcast != null) {if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG_BROADCAST,"processNextBroadcast [" + mQueueName + "]: waiting for "+ mPendingBroadcast.curApp);boolean isDead;if (mPendingBroadcast.curApp.pid > 0) {synchronized (mService.mPidsSelfLocked) {ProcessRecord proc = mService.mPidsSelfLocked.get(mPendingBroadcast.curApp.pid);isDead = proc == null || proc.crashing;}} else {final ProcessRecord proc = mService.mProcessNames.get(mPendingBroadcast.curApp.processName, mPendingBroadcast.curApp.uid);isDead = proc == null || !proc.pendingStart;}if (!isDead) {// It's still alive, so keep waitingreturn;} else {Slog.w(TAG, "pending app  ["+ mQueueName + "]" + mPendingBroadcast.curApp+ " died before responding to broadcast");mPendingBroadcast.state = BroadcastRecord.IDLE;mPendingBroadcast.nextReceiver = mPendingBroadcastRecvIndex;mPendingBroadcast = null;}}boolean looped = false;do {if (mOrderedBroadcasts.size() == 0) {// No more broadcasts pending, so all done!mService.scheduleAppGcsLocked();if (looped) {// If we had finished the last ordered broadcast, then// make sure all processes have correct oom and sched// adjustments.mService.updateOomAdjLocked();}return;}r = mOrderedBroadcasts.get(0);boolean forceReceive = false;// Ensure that even if something goes awry with the timeout// detection, we catch "hung" broadcasts here, discard them,// and continue to make progress.//// This is only done if the system is ready so that PRE_BOOT_COMPLETED// receivers don't get executed with timeouts. They're intended for// one time heavy lifting after system upgrades and can take// significant amounts of time.int numReceivers = (r.receivers != null) ? r.receivers.size() : 0;if (mService.mProcessesReady && r.dispatchTime > 0) {long now = SystemClock.uptimeMillis();if ((numReceivers > 0) &&(now > r.dispatchTime + (2*mTimeoutPeriod*numReceivers))) {Slog.w(TAG, "Hung broadcast ["+ mQueueName + "] discarded after timeout failure:"+ " now=" + now+ " dispatchTime=" + r.dispatchTime+ " startTime=" + r.receiverTime+ " intent=" + r.intent+ " numReceivers=" + numReceivers+ " nextReceiver=" + r.nextReceiver+ " state=" + r.state);broadcastTimeoutLocked(false); // forcibly finish this broadcastforceReceive = true;r.state = BroadcastRecord.IDLE;}

这里面调用了broadcastTimeoutLocked来进行ANR埋雷,

这个broadcastTimeoutLocked埋雷后的处理,显然应当是在另外一个线程中,

查看其定义

    final void setBroadcastTimeoutLocked(long timeoutTime) {if (! mPendingBroadcastTimeoutMessage) {Message msg = mHandler.obtainMessage(BROADCAST_TIMEOUT_MSG, this);mHandler.sendMessageAtTime(msg, timeoutTime);mPendingBroadcastTimeoutMessage = true;}}

使用了mHandler相应的线程looper去处理,这个mHander是什么

是在这里定义的,继续查看传入的handler是什么,在AMS中,有

mHandlerThread = new ServiceThread(TAG, THREAD_PRIORITY_FOREGROUND, false /*allowIo*/); 
mHandlerThread.start(); 
mHandler = new MainHandler(mHandlerThread.getLooper());mFgBroadcastQueue = new BroadcastQueue(this, mHandler, "foreground", BROADCAST_FG_TIMEOUT, false); 
mBgBroadcastQueue = new BroadcastQueue(this, mHandler, "background", BROADCAST_BG_TIMEOUT, true);

可以看到,是定义了一个ServiceThread,启动了一个线程looper,得证。

http://www.dtcms.com/wzjs/490894.html

相关文章:

  • 做衣服的网站网站排名监控工具
  • 网站设计配色方案百度2023免费
  • 杭州企业网站制作建站abc网站
  • wordpress评论采集插件企业关键词优化公司
  • 个人网站免费域名获取seo描述是什么
  • 没有网站怎么做网推成人技能培训
  • 怎么做网站赚钱的动漫网站百度产品推广怎么收费
  • 手机网站的作用进入百度一下官网
  • 重庆seo整站优化方案范文百度推广关键词规划师
  • 淄博 网站建设营销模式都有哪些
  • ui设计岗前培训3个月骗局seo首页网站
  • 海外网站怎么浏览网络软文营销
  • 网站错误页面模板今日国内新闻最新消息
  • 厦门做网站培训网络营销策划书8000字
  • 宣城市建设监督管理局网站公司网站建设哪家公司好
  • 外包网接单seo关键词工具
  • 百度做网站多少钱能做无锡百姓网推广
  • 怎么做网站的浏览栏说到很多seo人员都转行了
  • 自适应网站开发书籍爱站网关键词长尾挖掘工具
  • 淘宝的好券网站怎么做郑州seo技术服务顾问
  • 网站线上体系怎么宣传自己的店铺
  • 网站内容页相关性怎么做网络营销策划与创意
  • 要做网站照片怎么处理青岛网站建设与设计制作
  • 网站模板免费下载php网站关键词怎么快速上排名
  • 天津做网站的公司怎么样平台推广费用一般是多少
  • 保定网站优化招聘常用的网络推广的方法有哪些
  • 大气的网站模板网络营销产品推广方案
  • 淘宝的网站架构成都seo达人
  • 不关闭网站 备案seo创业
  • 做公众号需要网站培训机构不退钱最怕什么举报