首页 > 其他分享 >Android 11 下拉菜单长按WiFi图标SystemUI ANR

Android 11 下拉菜单长按WiFi图标SystemUI ANR

时间:2023-11-03 17:56:47浏览次数:45  
标签:11 10 01 java 08 WiFi AndroidRuntime 5792 下拉菜单

bug 描述:
(MTK)--Android 11的SystemUI下拉菜单长按图标(tiles)导致SystemUI崩溃重启。

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)

查看报错日志,有点像以前遇到的问题,关于new Handler(),但是没有在主线程里获取Looper ,把目标锁定在了(AssistManager.java:213),查看源码

mAssistDisclosure = new AssistDisclosure(context, new Handler());-->213行

在AssistManager.java里面发现了上述的东西,修改成-->mAssistDisclosure = new AssistDisclosure(context, new Handler(Looper.getMainLooper()));
最后还是报一样的错!!!

和之前碰到的问题不一样,重新查看异常原因:无法在没有调用Looper.prepare()的线程里处理handler。
去查看Handler.java的源码:

public Handler(Callback callback, boolean async) {
        if (FIND_POTENTIAL_LEAKS) {
            final Class<? extends Handler> klass = getClass();
            if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&
                    (klass.getModifiers() & Modifier.STATIC) == 0) {
                Log.w(TAG, "The following Handler class should be static or leaks might occur: " +
                    klass.getCanonicalName());
            }
        }

        mLooper = Looper.myLooper();
        if (mLooper == null) {
            throw new RuntimeException(
                "Can't create handler inside thread " + Thread.currentThread()
                        + " that has not called Looper.prepare()");
        }
        mQueue = mLooper.mQueue;
        mCallback = callback;
        mAsynchronous = async;
    }

在实例化 Handler 的时候 Handler 会去检查当前线程的 Looper 是否存在,如果不存在则会报异常,也就是说在创建 Handler 之前一定需要先创建 Looper。
而Looper.java 通过 Looper.prepare 方法来创建 Looper ,并且会借助 ThreadLocal 来实现与当前线程的绑定功能。
Looper.loop 则会开始不断尝试从 MessageQueue 中获取 Message , 并分发给对应的 Handler。
百度救我,关键字搜到一个-->相同问题

第二次修改,在new Handler 之前 创建looper
Looper.prepare();//add
mAssistDisclosure = new AssistDisclosure(context, new Handler());
Looper.loop();//add

编译完成,push之后长按点击下拉菜单中的wifi,SystemUI没有ANR,但是长按也没有跳转进入Setting中wifi设置。

at com.android.systemui.statusbar.phone.StatusBar.lambda$startActivityDismissingKeyguard$16(StatusBar.java:2709)
跟踪代码,发现是这一行用于跳转到对应的activity


+    
+    private Runnable lazyRunnable = new Runnable() {
+        @Override
+        public void run() {
+            mAssistManagerLazy.get().hideAssist();
+        }
+    };
+    
+
     public void startActivityDismissingKeyguard(final Intent intent, boolean onlyProvisioned,
             final boolean dismissShade, final boolean disallowEnterPictureInPictureWhileLaunching,
             final Callback callback, int flags) {
@@ -2706,7 +2715,8 @@ public class StatusBar extends SystemUI implements DemoMode,
         final boolean afterKeyguardGone = mActivityIntentHelper.wouldLaunchResolverActivity(
                 intent, mLockscreenUserManager.getCurrentUserId());
         Runnable runnable = () -> {
-            mAssistManagerLazy.get().hideAssist();
+            //mAssistManagerLazy.get().hideAssist();
+            mHandler.post(lazyRunnable);//add 
             intent.setFlags(
                     Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
             intent.addFlags(flags);

相同问题参考链接

标签:11,10,01,java,08,WiFi,AndroidRuntime,5792,下拉菜单
From: https://www.cnblogs.com/kato-T/p/17808102.html

相关文章

  • 编程猫11岁学员拿到NOC决赛一等奖,妈妈分享教育心得
    来自广州的龙芷盈今年11岁,上五年级。她在编程猫学习编程快三年的时间,已经拿到了蓝桥杯国赛二等奖、NOC决赛一等奖。小盈妈妈说“小盈平常有点难管教、很倔强”,但同时也是个有主见、有规划的孩子,她会自己做好学习规划和时间管理,这也让她在学校和编程猫的学习中都收获了很好的成......
  • 文心一言 VS 讯飞星火 VS chatgpt (127)-- 算法导论11.2 2题
    二、用go语言,位向量(bitvector)是一个仅包含0和1的数组。长度为m的位向量所占空间要比包含m个指针的数组少得多。请说明如何用一个位向量来表示一个包含不同元素(无卫星数据)的动态集合。字典操作的运行时间应为O(1)。文心一言,代码正常运行:在Go语言中,我们可以使用map[int]bool......
  • 文心一言 VS 讯飞星火 VS chatgpt (127)-- 算法导论11.2 2题
    二、用go语言,位向量(bitvector)是一个仅包含0和1的数组。长度为m的位向量所占空间要比包含m个指针的数组少得多。请说明如何用一个位向量来表示一个包含不同元素(无卫星数据)的动态集合。字典操作的运行时间应为O(1)。文心一言,代码正常运行:在Go语言中,我们可以使用map[int]bool来......
  • 11.2
    赛后关网罪大恶极T1上海直接算数基本定理点击查看代码#include<bits/stdc++.h>typedefintcount;typedeflonglongvalue;inlinevalueread(){countf(1);valuex(0);charch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;......
  • Aspose.Words for Java21.11去除水印和数量限制
    前言工欲善其事,必先利其器目前用到了word转pdf,然后开始研究大佬的文章,用于个人学习,首先感谢!源码分析1.下载Aspose.WordsforJava21.11官方jar包2.开始分析调用授权方法InputStreamis=newFileInputStream("..license.xml");Licenselicense=newLicense();license.setLi......
  • Win11_23H2_年度大版本更新
    大版本号:23H2内部版本号:22631.2428本系统镜像纯粹日常工作中自用并共享,基于微软官方原版镜像制作,目前只集成自应答文件和常用VC库,若你有好的建议或意见可发我邮箱;下载完记得验证hash值,以防翻车!文件说明:文件1.Win11_business_23H2_22631.2428_x64_update2023.11.iso★微软官方商业版......
  • 11月LeetCode每日一题: 117. 填充每个节点的下一个右侧节点指针 II
    题目描述:给定一个二叉树:structNode{intval;Node*left;Node*right;Node*next;}填充它的每个next指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将next指针设置为 NULL 。初始状态下,所有 next指针都被设置为 NULL 。 考察......
  • iwtgm-11
    题目链接A.能全买,就让剩余的总钱/全买,加上可得的糖数,总钱-这些花费此时不能全买,就遍历一遍,算出能买的总数再让剩余的总钱/能买的...这样是不会T的:设total为这一轮能买的糖果的总价格,last为之前剩下的钱,now为这一轮买完糖果后剩下的钱now=last%total,所以now<total,(取模肯定......
  • oracle异常问题ORA-01116、ORA-01110、ORA-27041:无法打开文件
    select*fromdba_data_files;ORA-01116:打开数据文件3出错ORA-01110:数据文件3:'/home/oracle/dmpfile20200903/test_xfh_db.dbf'ORA-27041:无法打开文件Linux-x86_64Error:2:NosuchfileordirectoryAdditionalinformation:301116.00000-"errorinopening......
  • 初识Setting 应用WIFI设置
    最近负责的一个简单定制化的setting,需要学习Wifi这一块方面的内容。通过这篇文章来了解一下原生的Setting处理Wifi的方式。有错误也希望大家提出来,我改进!使用步骤申请权限、获取系统服务WifiManager。通过wifiManager.startScan();扫描WiFi列表。注意这个动作是耗时的......