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

手机上的网站/引擎优化seo怎么做

手机上的网站,引擎优化seo怎么做,微信开放平台是什么,做网站用的字体是什么解决SystemUI下拉框中,长按WIFI图标会导致崩溃问题 文章目录 场景参考资料修改文件解决方案日志源码分析 总结 场景 在部分产品中偶发性发现, SystemUI下拉框下拉后长按WIFI图标会导致崩溃问题,有时候是截屏、点击Home 按键后,长…

解决SystemUI下拉框中,长按WIFI图标会导致崩溃问题

文章目录

  • 场景
  • 参考资料
  • 修改文件
  • 解决方案
    • 日志
    • 源码分析
  • 总结


场景

在部分产品中偶发性发现,

  • SystemUI下拉框下拉后长按WIFI图标会导致崩溃问题,有时候是截屏、点击Home 按键后,长按WIFI图标崩溃。
  • 第一次刷完固件开机OK的,重启后会复现,或者直接长按 崩溃必现。

这个现象很奇怪,平常自己开发中并不是所有项目都会遇到,

参考资料

Android11 下拉菜单长按WIFI 图标SystemUI ANR
参考资料有部分完整的报错信息日志和源码分析,方便理解问题。 核心就是在Handler 里面创建了Handler,Android体系不允许的。

new Handler()和new Handler(Looper.getMainLooper())的区别是什么?

区别总结来说:

  • 主线程本身就有一个Lopper,在程序起来的时候就已经lopper() 了,所以在主线程里面创建Handler,直接 new
    Handler()。 这个handler 发送消息自动会在Lopper() 队列里面等待执行。

  • 子线程里面不一样了,你创建了一个new Handler(), 系统不允许就报错了。 因为本身这个Handler()
    创建了就是个死Handler,无法让消息转动起来的。 所以系统不允许就直接报错了,如果想这样就是要在子线程中创建Handler ,那么就两个方案: 让这个Handler 有自己的Looper,所有就有了Lopper.prepare 和 Looper.loop; 或者在这个主线程中穿件的Handler 和 主线程关联起来,构造方法传递一个MainLoop 不就行了嘛。

如果 必现,这样的解决方案是OK的,就是在创建Handler 前后加Lopper.prepare() 和 Lopper.loop() 让线程中的消息循环起来。
如果是偶现,这样的解决方式肯定是不合理的,下面会给出我的修改解决方案
如果需要深究偶发原因,还需进一步重点分析,问题原因很简单就是子线程里面跑了Handler.

修改文件

相关关联文件
/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/assist/AssistManager.java修改文件
/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/assist/AssistManager.java具体修改内容
mAssistDisclosure = new AssistDisclosure(context, new Handler());修改为如下:
mAssistDisclosure = new AssistDisclosure(context, new Handler(Looper.getMainLooper()));

在这里插入图片描述

解决方案

日志

这里直接张贴一下别人家的日志 下。


10-01 08:01:11.236  5792  5833 E AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
10-01 08:01:11.236  5792  5833 E AndroidRuntime: Process: com.android.systemui, PID: 5792
10-01 08:01:11.236  5792  5833 E AndroidRuntime: java.lang.RuntimeException: Can't create handler inside thread Thread[AsyncTask #1,5,main] that has not called Looper.prepare()
10-01 08:01:11.236  5792  5833 E AndroidRuntime: 	at android.os.Handler.<init>(Handler.java:227)
10-01 08:01:11.236  5792  5833 E AndroidRuntime: 	at android.os.Handler.<init>(Handler.java:129)
10-01 08:01:11.236  5792  5833 E AndroidRuntime: 	at com.android.systemui.assist.AssistManager.<init>(AssistManager.java:213)
10-01 08:01:11.236  5792  5833 E AndroidRuntime: 	at com.android.systemui.assist.AssistManager_Factory.provideInstance(AssistManager_Factory.java:107)
10-01 08:01:11.236  5792  5833 E AndroidRuntime: 	at com.android.systemui.assist.AssistManager_Factory.get(AssistManager_Factory.java:70)
10-01 08:01:11.236  5792  5833 E AndroidRuntime: 	at com.android.systemui.assist.AssistManager_Factory.get(AssistManager_Factory.java:17)
10-01 08:01:11.236  5792  5833 E AndroidRuntime: 	at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
10-01 08:01:11.236  5792  5833 E AndroidRuntime: 	at com.android.systemui.statusbar.phone.StatusBar.lambda$startActivityDismissingKeyguard$16(StatusBar.java:2709)
10-01 08:01:11.236  5792  5833 E AndroidRuntime: 	at com.android.systemui.statusbar.phone.StatusBar.lambda$startActivityDismissingKeyguard$16$StatusBar(Unknown Source:0)
10-01 08:01:11.236  5792  5833 E AndroidRuntime: 	at com.android.systemui.statusbar.phone.-$$Lambda$StatusBar$fPMIOsYMhFXVKHESAjUObpcgeJM.run(Unknown Source:10)
10-01 08:01:11.236  5792  5833 E AndroidRuntime: 	at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305)
10-01 08:01:11.236  5792  5833 E AndroidRuntime: 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
10-01 08:01:11.236  5792  5833 E AndroidRuntime: 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
10-01 08:01:11.236  5792  5833 E AndroidRuntime: 	at java.lang.Thread.run(Thread.java:923)

源码分析

根据报错日志,找到了源码

在这里插入图片描述
报错的地方,注意两个地方:

  • 报错的地方已经修改,Handler() 构造方法,传递一个Looper.getMainLooper() 放到主线程
  • 这个类上面有一个Inject 注解,这个注意下,在引用地方就不是new 对象了的。

可以根据实际日志,反推调用地方是哪里报错了,如下追踪到StatusBar.java 源码了。
在这里插入图片描述

通过get() 方法,获取对象,创建了AssistManager 对象, 但是它是放到子线程里面调用的。 然后在AssistManager 构造方法里面穿件了Handler,所以直接报错了。

总结

通过这里的笔记学习和相关资料参考

  • 搞清楚Handler、Loop 的基本原理 相关原理不复杂需要掌握基本知识;搞清楚Looper.loop Lopper.prepare、Loop.getMainLooper 这些方法的使用。
http://www.whsansanxincailiao.cn/news/32037618.html

相关文章:

  • 做电影网站犯法吗/seo快照推广
  • 吉林省建设安全协会网站/安徽搜索引擎优化seo
  • 投标网站建设服务承诺/网站推广seo设置
  • 电商网站开发的职责/淘宝交易指数换算工具
  • 整合营销方案/上海抖音seo公司
  • 怎么做自己的发卡网站/互联网营销师培训学校
  • 代做论文 软件指导去哪些网站/谷歌seo搜索引擎优化
  • 郑州做网站建设的公司/韶关网站seo
  • 高要区住房和城乡建设局网站/sem优化软件选哪家
  • 太原学网站开发的学校/百度指数是怎么计算的
  • 电子商务网站建设实验报告/东莞疫情最新消息今天又封了
  • [ 1500元做网站_验收满意再付款! /千锋教育和黑马哪个好
  • 网站建设公司无锡/教育培训机构官网
  • 点胶喷嘴技术支持东莞网站建设/网站没有友情链接
  • 东莞建设网站公司/windows优化大师收费吗
  • 有源码搭建网站难不难/百度上广告怎么搞上去的
  • o2o网站建设渠道/手机百度2020最新版
  • 做网站一屏的尺寸是/ks刷粉网站推广马上刷
  • 服务行业网站建设/搜索引擎优化的基本原理
  • 苏州网站建设哪家效果好/营销软文是什么意思
  • 网站上可以做文字链接么/草莓永久地域网名入2022
  • c2c网站建设/站外引流推广渠道
  • 10类地方网站 总有适合你做的/企业培训内容包括哪些内容
  • 文件上传网站源码/香港旺道旺国际集团
  • 龙岗公司网站/企业推广策略
  • 大学生做网站怎么赚钱/网络营销活动策划
  • 网站设计培训班哪家好/网络营销八大工具
  • 国家企业信用公示信息年报入口/东莞seo建站咨询
  • 加强政府网站建设工作要求/网络推广主要是做什么工作
  • 网站需要更新的频率/有效的网络推广