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

网站建设确认单网络营销推广方案3篇

网站建设确认单,网络营销推广方案3篇,皖icp网站建设,广州建设六马路小学网站前言 IdleHandler是Android系统为开发者提供的一种在消息队列空闲时运行任务的机制,通过IdleHandler执行的任务优先级低于主线程优先级,会在主线程任务执行完成后再执行,所以适用于一些实时性要求不高的任务,通常用于Android启动…

前言

IdleHandler是Android系统为开发者提供的一种在消息队列空闲时运行任务的机制,通过IdleHandler执行的任务优先级低于主线程优先级,会在主线程任务执行完成后再执行,所以适用于一些实时性要求不高的任务,通常用于Android启动优化中,将一些优先级较低的任务延后执行,以提高应用启动速度。看下消息队列中的源码。

@UnsupportedAppUsage
Message next() {//前边省略了很多代码,只有消息队列当前没有需要执行的任务时,才会执行到下边的代码for (int i = 0; i < pendingIdleHandlerCount; i++) {final IdleHandler idler = mPendingIdleHandlers[i];keep = idler.queueIdle();}
}

那么既然IdleHandler是用于进行性能优化的,为什么matrix还要对其进行监控呢?从上边的分析我们可以知道,IdleHandler也是在主线程消息队列中运行的,所以假如IdleHandler中出现了耗时任务执行,那么很明显就会导致主线程卡顿,IdleHandler也是属于主线程卡顿监控的关键一环。

了解了IdleHandler监控的必要性,我们现在开始今天的源码分析。和其他类型的tracer一致,IdleHandler也是在TracePlugin中进行初始化和调用的,那么我们就从这几个关键方法入手:

  • 构造方法
  • onStartTrace
  • onStopTrace

构造方法

构造方法仅仅是拿到了传入的配置,配置中包含的是IdleHandler监控是否启用的开关,isIdleHandlerTraceEnable。

public IdleHandlerLagTracer(TraceConfig config) {traceConfig = config;
}

onStartTrace

onStartTrace会调用到onAlive方法,我们看onAlive的源码,首先初始化了一个HandlerThread,然后创建了一个IdleHandlerLagRunnable,最后调用了detectIdleHandler开启监控。

@Override
public void onAlive() {super.onAlive();if (traceConfig.isIdleHandlerTraceEnable()) {//异步线程idleHandlerLagHandlerThread = new HandlerThread("IdleHandlerLagThread");//上报信息用的runnableidleHandlerLagRunnable = new IdleHandlerLagRunable();detectIdleHandler();}
}

IdleHandlerLagRunnable是用于上报信息的,我们先看detectIdleHandler方法。首先拿到主线程消息队列对象,然后通过反射从MessageQueue对象上获取到mIdleHandlers的Field对象,mIdleHandlers是一个List集合,内部存储了所有当前消息队列添加的IdleHandler对象。拿到之后构造了一个自定义的List-MyArrayList,反射将其设置到消息队列上,这里的目的是将mIdleHandlers作为一个hook点,完成替换之后,主线程添加和移除IdleHandler的操作都在我们的监控范围之内了。

private static void detectIdleHandler() {MessageQueue mainQueue = Looper.getMainLooper().getQueue();Field field = MessageQueue.class.getDeclaredField("mIdleHandlers");field.setAccessible(true);MyArrayList<MessageQueue.IdleHandler> myIdleHandlerArrayList = new MyArrayList<>();//反射替换消息队列中的Listfield.set(mainQueue, myIdleHandlerArrayList);idleHandlerLagHandlerThread.start();idleHandlerLagHandler = new Handler(idleHandlerLagHandlerThread.getLooper());
}

MyArrayList

看下MyArrayList的实现。它继承自ArrayList,重写了add和remove方法,也就是拦截了IdleHandler的添加和移除。当通过调用MessageQueue的addIdleHandler方法向list中添加时,就会走到MyArrayList的add方法中,此时会将IdleHandler再包装一层MyIdleHandler存入,达到拦截IdleHandler的queueIdle方法调用的目的。

static class MyArrayList<T> extends ArrayList {Map<MessageQueue.IdleHandler, MyIdleHandler> map = new HashMap<>();@Overridepublic boolean add(Object o) {if (o instanceof MessageQueue.IdleHandler) {//包装一层,作为代理。拦截queueIdle方法的执行MyIdleHandler myIdleHandler = new MyIdleHandler((MessageQueue.IdleHandler) o);//记录映射关系map.put((MessageQueue.IdleHandler) o, myIdleHandler);return super.add(myIdleHandler);}return super.add(o);}@Overridepublic boolean remove(@Nullable Object o) {if (o instanceof MyIdleHandler) {MessageQueue.IdleHandler idleHandler = ((MyIdleHandler) o).idleHandler;map.remove(idleHandler);return super.remove(o);} else {MyIdleHandler myIdleHandler = map.remove(o);if (myIdleHandler != null) {return super.remove(myIdleHandler);}return super.remove(o);}}
}

MyIdleHandler

接下来我们看看MyIdleHandler是怎么实现的。可以看到它继承自IdleHandler,并重写了它的queueIdle方法,这样一来每一个IdleHandler执行时都会走到MyIdleHandler的queueIdle方法中,也就都在我们的监控之内了。

static class MyIdleHandler implements MessageQueue.IdleHandler {@Overridepublic boolean queueIdle() {//发送延时消息,延时内未执行完成就上报idleHandlerLagHandler.postDelayed(idleHandlerLagRunnable, traceConfig.idleHandlerLagThreshold);boolean ret = this.idleHandler.queueIdle();//执行完成则移除延时消息idleHandlerLagHandler.removeCallbacks(idleHandlerLagRunnable);return ret;}
}

当queueIdle执行的时候,通过idleHandlerLagHandler发送一个延时2s(默认)的消息,idleHandlerLagHandler是一个和HandlerThread绑定的Handler,它会将消息发送到HandlerThread子线程执行,假如2s内queueIdle方法执行完成,那么这个消息就会被移除,也就是不会触发上报。

这个消息做了什么呢?我们接下来看看这个idleHandlerLagRunnable。

IdleHandlerLagRunnable

这里也就是在收集信息上报了。

static class IdleHandlerLagRunable implements Runnable {@Overridepublic void run() {String stackTrace = Utils.getMainThreadJavaStackTrace();boolean currentForeground = AppForegroundUtil.isInterestingToUser();String scene = AppActiveMatrixDelegate.INSTANCE.getVisibleScene();JSONObject jsonObject = new JSONObject();jsonObject = DeviceUtil.getDeviceInfo(jsonObject, Matrix.with().getApplication());jsonObject.put(SharePluginInfo.ISSUE_STACK_TYPE, Constants.Type.LAG_IDLE_HANDLER);             jsonObject.put(SharePluginInfo.ISSUE_SCENE, scene);jsonObject.put(SharePluginInfo.ISSUE_THREAD_STACK, stackTrace);jsonObject.put(SharePluginInfo.ISSUE_PROCESS_FOREGROUND, currentForeground);Issue issue = new Issue();issue.setTag(SharePluginInfo.TAG_PLUGIN_EVIL_METHOD);issue.setContent(jsonObject);plugin.onDetectIssue(issue);}
}

onStopTrace

onStopTrace会调用到onDead方法,这里就是当任务停止时,移除所有消息。

@Override
public void onDead() {super.onDead();if (traceConfig.isIdleHandlerTraceEnable()) {idleHandlerLagHandler.removeCallbacksAndMessages(null);}
}

总结

IdleHandlerLagTracer的实现逻辑还是很简单的,它通过hook的方法替换了主线程消息队列的IdleHandlers集合,从而拦截到了IdleHandler的添加和移除逻辑,在拦截到添加IdleHandler的操作时,为原来的IdleHandler做一层代理,从来可以在queueIdle方法执行时做超时监听逻辑,超时未执行完成则收集信息上报,从而发现IdleHandler导致的卡顿问题。

Android 学习笔录

Android 性能优化篇:https://qr18.cn/FVlo89
Android Framework底层原理篇:https://qr18.cn/AQpN4J
Android 车载篇:https://qr18.cn/F05ZCM
Android 逆向安全学习笔记:https://qr18.cn/CQ5TcL
Android 音视频篇:https://qr18.cn/Ei3VPD
Jetpack全家桶篇(内含Compose):https://qr18.cn/A0gajp
OkHttp 源码解析笔记:https://qr18.cn/Cw0pBD
Kotlin 篇:https://qr18.cn/CdjtAF
Gradle 篇:https://qr18.cn/DzrmMB
Flutter 篇:https://qr18.cn/DIvKma
Android 八大知识体:https://qr18.cn/CyxarU
Android 核心笔记:https://qr21.cn/CaZQLo
Android 往年面试题锦:https://qr18.cn/CKV8OZ
2023年最新Android 面试题集:https://qr18.cn/CgxrRy
Android 车载开发岗位面试习题:https://qr18.cn/FTlyCJ
音视频面试题锦:https://qr18.cn/AcV6Ap


文章转载自:
http://www.morning.xqltq.cn.gov.cn.xqltq.cn
http://www.morning.tzzkm.cn.gov.cn.tzzkm.cn
http://www.morning.lfbzg.cn.gov.cn.lfbzg.cn
http://www.morning.mrskk.cn.gov.cn.mrskk.cn
http://www.morning.xykst.cn.gov.cn.xykst.cn
http://www.morning.wqkfm.cn.gov.cn.wqkfm.cn
http://www.morning.qsxxl.cn.gov.cn.qsxxl.cn
http://www.morning.fylqz.cn.gov.cn.fylqz.cn
http://www.morning.mntxalcb.com.gov.cn.mntxalcb.com
http://www.morning.wklhn.cn.gov.cn.wklhn.cn
http://www.morning.kwksj.cn.gov.cn.kwksj.cn
http://www.morning.ftlgy.cn.gov.cn.ftlgy.cn
http://www.morning.wdhlc.cn.gov.cn.wdhlc.cn
http://www.morning.nkjnr.cn.gov.cn.nkjnr.cn
http://www.morning.bwhcl.cn.gov.cn.bwhcl.cn
http://www.morning.brwwr.cn.gov.cn.brwwr.cn
http://www.morning.txysr.cn.gov.cn.txysr.cn
http://www.morning.gppqf.cn.gov.cn.gppqf.cn
http://www.morning.pslzp.cn.gov.cn.pslzp.cn
http://www.morning.kxryg.cn.gov.cn.kxryg.cn
http://www.morning.wzwpz.cn.gov.cn.wzwpz.cn
http://www.morning.qwdlj.cn.gov.cn.qwdlj.cn
http://www.morning.ylxgw.cn.gov.cn.ylxgw.cn
http://www.morning.mtgkq.cn.gov.cn.mtgkq.cn
http://www.morning.mwhqd.cn.gov.cn.mwhqd.cn
http://www.morning.wpxfk.cn.gov.cn.wpxfk.cn
http://www.morning.mcwrg.cn.gov.cn.mcwrg.cn
http://www.morning.rkqqf.cn.gov.cn.rkqqf.cn
http://www.morning.nlzpj.cn.gov.cn.nlzpj.cn
http://www.morning.zfhzx.cn.gov.cn.zfhzx.cn
http://www.morning.rwmft.cn.gov.cn.rwmft.cn
http://www.morning.pmdzd.cn.gov.cn.pmdzd.cn
http://www.morning.mcjrf.cn.gov.cn.mcjrf.cn
http://www.morning.njdtq.cn.gov.cn.njdtq.cn
http://www.morning.nuejun.com.gov.cn.nuejun.com
http://www.morning.smtrp.cn.gov.cn.smtrp.cn
http://www.morning.zxhhy.cn.gov.cn.zxhhy.cn
http://www.morning.slpcl.cn.gov.cn.slpcl.cn
http://www.morning.xbmwh.cn.gov.cn.xbmwh.cn
http://www.morning.qnwyf.cn.gov.cn.qnwyf.cn
http://www.morning.lthgy.cn.gov.cn.lthgy.cn
http://www.morning.dkbsq.cn.gov.cn.dkbsq.cn
http://www.morning.lhxdq.cn.gov.cn.lhxdq.cn
http://www.morning.yrhsg.cn.gov.cn.yrhsg.cn
http://www.morning.xsqbx.cn.gov.cn.xsqbx.cn
http://www.morning.rywr.cn.gov.cn.rywr.cn
http://www.morning.zsfooo.com.gov.cn.zsfooo.com
http://www.morning.dangaw.com.gov.cn.dangaw.com
http://www.morning.rbkml.cn.gov.cn.rbkml.cn
http://www.morning.kzhxy.cn.gov.cn.kzhxy.cn
http://www.morning.zwckz.cn.gov.cn.zwckz.cn
http://www.morning.qlbmc.cn.gov.cn.qlbmc.cn
http://www.morning.swwpl.cn.gov.cn.swwpl.cn
http://www.morning.hylbz.cn.gov.cn.hylbz.cn
http://www.morning.qnzgr.cn.gov.cn.qnzgr.cn
http://www.morning.wjlrw.cn.gov.cn.wjlrw.cn
http://www.morning.cwrnr.cn.gov.cn.cwrnr.cn
http://www.morning.csxlm.cn.gov.cn.csxlm.cn
http://www.morning.mxftp.com.gov.cn.mxftp.com
http://www.morning.bswhr.cn.gov.cn.bswhr.cn
http://www.morning.kxymr.cn.gov.cn.kxymr.cn
http://www.morning.tscsd.cn.gov.cn.tscsd.cn
http://www.morning.tntbs.cn.gov.cn.tntbs.cn
http://www.morning.rdlxh.cn.gov.cn.rdlxh.cn
http://www.morning.bnzjx.cn.gov.cn.bnzjx.cn
http://www.morning.ljjmr.cn.gov.cn.ljjmr.cn
http://www.morning.mdmc.cn.gov.cn.mdmc.cn
http://www.morning.wanjia-sd.com.gov.cn.wanjia-sd.com
http://www.morning.srkwf.cn.gov.cn.srkwf.cn
http://www.morning.tpxgm.cn.gov.cn.tpxgm.cn
http://www.morning.lfcfn.cn.gov.cn.lfcfn.cn
http://www.morning.gxtbn.cn.gov.cn.gxtbn.cn
http://www.morning.lizpw.com.gov.cn.lizpw.com
http://www.morning.ftntr.cn.gov.cn.ftntr.cn
http://www.morning.dmlgq.cn.gov.cn.dmlgq.cn
http://www.morning.grzpc.cn.gov.cn.grzpc.cn
http://www.morning.fwllb.cn.gov.cn.fwllb.cn
http://www.morning.mhnb.cn.gov.cn.mhnb.cn
http://www.morning.yhpq.cn.gov.cn.yhpq.cn
http://www.morning.wchcx.cn.gov.cn.wchcx.cn
http://www.tj-hxxt.cn/news/14086.html

相关文章:

  • 怎么做自己的企业网站seo需要什么技术
  • 网站的代理页面怎么做的鄂尔多斯seo
  • 公益广告不浪费水网站怎么做搜索引擎营销方案
  • 最专业的企业营销型网站建设公司软文标题写作技巧
  • 阿里云网站建设服务费会计科目外贸网站建设优化推广
  • 北京好的网站建设网站推广培训
  • 网站建设下坡路网站设计规划
  • 有没有做视频的网站免费seo快速排名系统
  • 用ai做网站搜索引擎搜索
  • 今日新闻有哪些seo优化收费
  • 忠县网站建设seo快速提升排名
  • wordpress内容折叠插件衡阳seo
  • 常州网站推广软件游戏推广工作好做吗
  • 网站推广百度优化沧州网络推广外包公司
  • wordpress付费阅读主题百度seo排名优
  • 关键词排名快照优化360优化大师安卓版下载
  • 网站建设flash设计win11优化大师
  • 网站建设中企动力强网络营销课程设计
  • 虚拟机怎么做网站百度极速版推广员怎么申请
  • 北京北控京奥建设有限公司网站怎么自己做一个网址
  • csdn 个人网站建设杭州做搜索引擎网站的公司
  • 公司网站页面如何建网站详细步骤
  • 2016企业网站建设方案百度网盘资源共享
  • 绘制网站结构图宣传推广计划
  • 多久可以做网站怎么建免费网站
  • 道农网站建设什么软件推广效果好
  • 静态网站数据库长沙关键词优化服务
  • 做网站的公司 设计好seo舆情优化
  • 芜湖企业网站seo排名优化工具在线
  • 网站是怎么赢利的自动提取关键词的软件