Toast不是乱弹的

【安卓逆向】 栈跟踪及toast方法及Log日志的插入和分析 在安卓逆向中,常常用到栈跟踪及toast方法及Log日志的插入 以便于我们更好的分析代码 下面就演示记录这三个方法的使用及简单的分析: 1.插入Log信息输出: 在方法的开始处,我们右击->插入代码->Log信息输出 然后我们反编译apk,并安装到模拟器,打开ddms查看log日志 这里我们就看到了刚刚在更新代码添加的log信息。 2.toast弹窗的输出 ... 阅读详情
一  前言

Toast在android里面弹的很多了,但是在分线程里面弹会怎么样呢? 有些同学会说,那还不是和平时一样的弹?!其实,也不尽然,不信?请继续往下面看。


二 分线程弹Toast引发的问题

如果在分线程里面直接弹Toast,比如下面这样,button点击的时候启动一个线程,弹出一个Toast:


那么就会得到一个应用程序异常终止的错误弹窗。

原因如下:
复制内容到剪贴板
代码:
E/AndroidRuntime( 8978): FATAL EXCEPTION: Thread-2221

E/AndroidRuntime( 8978): Process: com.example.androidtest, PID: 8978

E/AndroidRuntime( 8978): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

E/AndroidRuntime( 8978):         at android.os.Handler.<init>(Handler.java:200)

E/AndroidRuntime( 8978):         at android.os.Handler.<init>(Handler.java:114)

E/AndroidRuntime( 8978):         at android.widget.Toast$TN.<init>(Toast.java:347)

E/AndroidRuntime( 8978):         at android.widget.Toast.<init>(Toast.java:100)

E/AndroidRuntime( 8978):         at android.widget.Toast.makeText(Toast.java:254)

E/AndroidRuntime( 8978):         at com.example.androidtest.MainActivity$1$1.run(MainActivity.java:40)

E/AndroidRuntime( 8978):         at java.lang.Thread.run(Thread.java:818)

D/ActivityManager(  939): addErrorToDropBox processName = com.example.androidtest
意思是如果没有调用Looper.prepare(),就不能初始化Handler对象。看错误堆栈,是Toast.makeText()的时候会初始化Handler对象。

这个调用过程如下:

1. 从Toast.makeText(...)开始
1 public static Toast makeText(Context context, CharSequence text, int duration) {
2         Toast result = new Toast(context);
3  
4         ...
5  
6         return result;
7     }
它会初始化一个Toast对象,继续看Toast的构造函数:

2.
1 public Toast(Context context) {
2         mContext = context;
3         mTN = new TN();
4         ...
5     }
在Toast的构造函数里面,会初始化一个TN对象,这个TN对象是什么东西呢?

3.
1 private static class TN extends ITransientNotification.Stub {
2 final Handler mHandler = new Handler();   
3 ...
4 }
这个TN对象是Binder对象的子类,显而易见,它是跨进程通信用的。其实它就是和系统Toast服务通信用的,应用程序需要把自己的Toast请求发送给系统Toast服务,告诉它,我需要弹一个什么样的Toast。
所以需要TN这个东东。

而TN这个东东需要初始化Handler成员变量,所以就会调用到Handler初始化这边。

4.  Handler初始化
01 public Handler(Callback callback, boolean async) {
02          
03  
04         mLooper = Looper.myLooper();
05         if (mLooper == null) {
06             throw new RuntimeException(
07                 "Can't create handler inside thread that has not called Looper.prepare()");
08         }
09          
10     }
Handler初始化的时候会拿出与当前线程相关的Looper对象,如果不存在,也就是没有调用过Looper.prepare()方法的话,就会报错。

这就是上面错误的来源啦!

三 如何解决?

知道原因后,就比较好解决了,于是就出现了下面的代码:




在分线程弹出Toast之前把Looper准备好,实验表明,这样确实可以达到效果。可以把Toast弹出来。

但是这样有个问题,就是会导致分线程永远不会退出。这个原理大家看看Looper.loop()是怎么实现的就知道了,它里面是一个死循环。

这样的话,会导致进程里面的线程越来越多,这个本人是不推荐的。

四 另外一种解决方法

除了第三种方法之外,我们还有种方法,就是把Toast丢到主线程去弹出来。

也很简单,主要初始化一个主线程的Handler,然后调用Handler.postRunnable()方法就可以了。,如下:




Android下各语言加callStack示例 Android下各语言加callStack打印信息的示例 包括C语言, C++,Java和Kernel Space。 立即下载

相关推荐

华为硬件逻辑岗笔试题(一)

积少成多,集腋成裘,坚持!!! 目录 1. 进制转换 2. 状态机和编码方式 3. 存储器的分类 4. Verilog语法中的操作符 5. 对组合逻辑的认识 6. 对时序逻辑的认识 7. 竞争冒险的认识 8. 基本时序逻辑电路 9. 建立时间和保持时间 10. 同步时序电路 11. 组合逻辑和时序逻辑判断 13. 基本总线的理解 14.加法器 15.FPGA开发工具 1. 进制转换 1、十进制46.25对应的二进制表达式为( )。 A 101110.11...

qq_42235129的博客 1万+

改变Toast的弹出级别

package com.ime.util; import java.lang.reflect.Field; import com.ime.tts.Logger; import android.annotation.SuppressLint; import android.content.Context; import android.view.WindowManager; import and...

stay_foolish_one的专栏 2562

如何理解反步法设计控制器?

假设以二阶系统为例,被控对象的系统状态方程为: 基于反步控制的具体方法如下: 1.1步骤一 定义期望状态为xd,状态误差e1,为: e1=x1-xd; 则e1的导数为: 1.2步骤二 定义虚拟控制量为: e2定义为: 1.3步骤三 定义Lyapunov能量函数为: 1.4步骤四 定义总Lyapunov能量函数为: 因此设计的控制律为: 设计c>0,则: 满足Lyapunov的稳定性判定条件...

weixin_42736130的博客 2万+

Android窗口层级(Window Type)分析

车载方案存在倒车等特殊界面需要在较高的窗口层级显示,Android原有的窗口层级不满足车载需求,因此都会自定义车载窗口层级。下图为参考自定义的窗口层级:android自定义窗口层级(自定义车载系统中倒车影像显示层级)自定义窗口层级在不同Android版本中的初始层级值也是不同,因此需要通过系统属性来判断初始值。例如在Android 13平台的默认属性为2401,在Andoid 9等平台为2031。这样做的目的是由于跟Android原生的窗口层级存在冲突,因此需要根据平台来调节初始值。

分享技术与经验的博客 1万+

数模【Mathematica(安装、入门方法、基本计算、基本图形、创建互动模型、利用数据、幻灯片演示、完整实例)】

Mathematica(安装and激活、入门方法、基本计算、基本图形、创建互动模型、利用数据、幻灯片演示、完整实例) Mathematica_11.3.0 安装教程 Mathematica11.3 激活 P1 笔记本 P2 入门方法 P3 基本计算 P4 基本图形 P5 创建互动模型 P6 利用数据 P7 演示 P8 完整实例

upward 12万+

详解岭回归与L2正则化

最小二乘法存在不可逆和病态问题,导致解析解不可计算或不稳定,岭回归是一种有效的解决方法,以损失无偏性来换取稳定解, 本文介绍详细介绍了岭回归的基本原理,并从L2正则化角度来进行了解释。

Luoyingfeng的博客 1万+

安卓逆向_4 --- 定位关键Smali、monitor使用、log插桩、栈追踪、methodprofiling(方法分析)

定位关键Smali、monitor使用、log插桩、栈追踪、methodprofiling(方法分析)

freeking101的博客 7116

【吐血整理-历时两个月,长达万字】FDTD Solutions学习笔记

原教学视频来自于Ansys-Lumerical官方的FDTD100,所看视频来自B站大佬UP主 【Nestor_呐等】 的幸苦翻译,本文内容粘贴自我个人在学习FDTD100时,通过字幕和一些个人理解总结的一份word。整理不易,强烈建议收藏!...

weixin_45719141的博客 10万+

取代Toast.makeText(this, “String“, Toast.LENGTH_SHORT).show();总是报错

【代码】解决Toast总是报错。

u011501017的博客 3119

GAMES101作业3-遇到的各种问题及解决方法

记录在做作业3时遇到的一些坑!以及最后的解决办法。

qq_41835314的博客 6817

PyQt5数据库开发3 6 QSqlQuery完整实操案例【图文详解】

PyQt5数据库开发3 6.1 QSqlQuery实操案例【多图详解】,本文有点长,主要每一个步骤都有对应的图文教程!!!

qq_53317005的博客 2962

connectivity.bluetooth.phone.BluetoothPhoneBookService#getFrequentContacts contactItemList.size() =0

contactItemList.size() =0

2502_91037993的博客 190

如何跑通SuperPoint+LightGlue的训练代码使用gluefactory进行训练和评估?

🏆本文收录于专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家!持续更新中,up!up!up!!

**My Coding Family** 1786

Appium自动化测试在小米设备上获取通知权限的完整解决方案

在移动应用自动化测试领域,Appium作为跨平台框架,其核心原理是通过模拟用户操作与设备系统进行交互。然而,不同Android厂商的系统定制化,尤其是权限管理机制的差异,会直接影响自动化脚本的稳定性和可靠性。小米的MIUI/HyperOS系统在Android原生权限模型基础上,增加了额外的安全层,对通知监听等敏感权限实施了更严格的管控,这构成了自动化测试中的常见技术挑战。从工程实践角度看,理解并适配这些定制化规则,是保障测试流程在特定设备环境稳定运行的关键。本文聚焦于Appium Settings应用在小米

weixin_30681615的博客 336

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

android 底部弹窗_常见的弹窗及应用-Action sheet、Modal、Toast、浮出层

在交互设计的过程中,发现关于弹窗的应用,大家不是很明确,应用起来大部分是看美观:这个操作太多了,用弹层吧;这个操作只有一个按钮,用对话框吧;这个提示不重要,用toast吧...Action sheet、Modal、Toast都是什么呢?我们实际的应用场景是什么样的呢?首先,我们来明确一个概念,什么是模态对话框?什么是非模态对话框?模态对话框&非模态对话框区别是模态还是非模态的对话框,通过用...

weixin_39815600的博客 1397

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

android 顶部消息通知和Toast顶部弹窗消息提醒

1.顶部通知栏的消息通知 Intent intent = new Intent(mContext, 跳转到哪个Activity.class); //点击了之后进入的一个Actity PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent, PendingIntent.FLAG_ONE...

zhaohan___的博客 1万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Andorid : Toast(弹出框)- 简单应用

Andorid : Toast(弹出框)- 简单应用

javaGHui的博客 744

使用okhttp时出现错误

出现android.view.ViewRootImpl$CalledFromWrongThreadException这种错误, 原因是因为在onResponse执行的线程并不是UI线程。需要: @Override public void onResponse(final Response response) throws IOException { final String res

Basil_的博客 2548

微信小程序使用weapp ui框架踩坑 Toast引入报错

最近开发小程序使用了有赞的ui库,weapp,在用到Toast 轻提示组件时遇到了一个小坑,在这记录一下 首先官方给了使用的代码演示 然后按照他给的引入方式 在项目中却报错了 研究了一下发现官方给的引入路径有问题 自己修改一下可以正常使用了 import Toast from '@vant/weapp/toast/toast'; ...

yfsir的博客 1063

apk运行出错 Error: java.lang.RuntimeException: Binary XML file line #

有控件的高度没有设置

w6028819321的专栏 842

设计模式详解——工厂模式(一)

本篇文章介绍一种设计模式——工厂模式。工厂模式是用来封装对象的创建,减少应用程序和具体类之间的依赖,促进松耦合。根据工厂模式的应用特性,一共分为三种子模式:简单工厂模式,工厂方法模式和抽象工厂模式。本篇文章主要介绍简单工厂模式。本篇文章内容参考《JAVA与模式》之简单工厂模式。 一、简单工厂模式简介1.定义简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static

LRH0211的博客 684

android Toast提示异常:java.lang.RuntimeException: Can't create handler inside thread that has not called

android Toast提示异常:java.lang.RuntimeException: Can't create handler inside thread that has not called 仔细检查了代码,不应该异常啊??  没有 handler相关代码啊?                原来是在子线程弹Toast了, 切记,Toast只能在UI线程弹出,如果一定要在子线程弹,那么

tihi的博客 1万+

jquery-weui-1.0.1弹出popup层多次点击以后无法弹出层解决方法

最近用jquery-weui做手机页面,发现popup层弹出多次以后点击无法弹出层了, 进入假死卡死状态,调试发现在每次弹出popup层之前调用了一次关闭层的操作 为什么在调用打开层的方法中调用关闭的方法? 最后发现只要注释关闭的方法就可以解决多次点击以后卡死的状态

雨夜星辰03--的博客 3013

vue this.$toast 失效问题汇总

vue this.$toast 失效问题汇总

质量不太好的博客 1305
上一篇: linux编程之pipe()函数
下一篇: MIME TYPE
Manaasdfasdf
博客等级 码龄11年 131粉丝 151原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值