Android 11 下拉菜单长按WiFi图标SystemUI ANR
1.Android 11 -- 强制清理app后台,关于权限引发的问题2.Android 11 (MTK)状态栏图标反色-->跟随当前应用变化代码流程3.Android 11 --关于Toast的异常4.Android 11 -- 关于dialog和悬浮窗导致SystemUI状态栏下拉频繁闪烁(窗口焦点问题)
5.Android 11 下拉菜单长按WiFi图标SystemUI ANR
6.Android 11 sim卡来电不弹出悬浮通知,默认来电默认全屏7.Android Bluetooth 蓝牙开发/蓝牙协议 小结8.Android11 —— 自定义添加一个System Services9.Android系统——AOSP相关-->随记10.Android11 , Launcher3 切换阿拉伯语,最近应用(后台)不能滑动11.Android 底层问题日志记录12.Android 11 -- app 服务保活13.Android11 - 添加自定义服务注意事项14.Android 11 导航栏添加一个虚拟按钮--问题合集15.Android 11--设置第三方Launcher并默认 与 如何预置apk16.Android11 系统修改 AOSP输入法的默认输入键盘布局17.Settings里面切换不同Launcher的代码流程18.关于Android`系统默认屏保`19.关于Android 11 Settings添加新的选项界面的细节20.Android 11 自由窗口模式 || 全屏模式启动app21.强制app横屏显示或者竖屏显示(动态)22.Android 11 禁止从SD卡上安装第三方应用23.实体物理音量键替换为home键24.AMS- kill Launcher进程的代码流程25.Android 11 recovery恢复出厂设置保留某些文件26.Android 11 禁用 adb root (userdebug版本)27.Android11 应用默认获取通知使用权限(可以获取系统所有通知信息)28.Android 11 UsbDebug 关于adb RSA 认证29.Android 11 NavigationBar && Status Bar 如果改变背景颜色30.Anroid 11 关于NotificationManager && NotificationManagerService -- 衍生到权限管理31.Android13 控制设置界面 双栏显示或单栏显示32.Android 13 大屏显示时关于SystemUI和Launcher3问题33.Android 系统适配无源码app34.Android 11 关于app的权限重置35.Android 11.0 关于app进程保活36.Android 11 关于按键拦截/按键事件处理分享37.Android R Settings关于屏保/PowerManagerService欺骗系统不让其进入休眠状态38.Android13 关于SystemUI更新/Nav Bar add volume button&&other button39.Android 13 移植EthernetSettings/Ethernet更新40.Anrdoir 13 关于设置静态IP后,突然断电,在上电开机卡动画41.Android T(13) The app is granted permissions by default42.Android T 关于屏幕旋转 (一)43.Android T about screen rotation(二)44.Android 13 about launcher3 (1)45.Android T don't abort background activity starts46.Android T adout replace bootanimation47.Launcher start App WINDOWING_MODE_FREEFORM48.Android 11 About SleepToken / (Settings)Screen timeout49.Settings.System数据监听/prop&SystemProperties数据监听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);
Can‘t toast on a thread that has not called Looper.prepare异常 通常出现在子线程不能更新UI
一解:
Looper.prepare();
Toast.makeText(context, "xxx", Toast.LENGTH_SHORT).show();
Looper.loop();
二解:
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(context, "xxx", Toast.LENGTH_SHORT).show();
}
});
分类:
Android
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库