Android4.0 Toast显示问题分析_安卓4.0不支持uni.showtoast-程序员宅基地

技术标签: exception  null  string  android  thread  

在修复RUI桌面在4.0系统下的提示信息不完善的Bug过程的一些思路与大家分享一下。

Bug描述:

RUI在2.2的系统点击推荐图标下载后,就会进入下载队列中下载,如果再次点击相同的图标就会使用Toast提示“**已经在下载队列中”。但是在4.0的系统就会出现异常,第二次点击相同的推荐图标时没有出现Toast提示。

相关源码:

public static void showMessage(final Context act, final int gravity, final String msg) {
	    Toast.makeText(act, msg, Toast.LENGTH_SHORT).show();
		new Thread(new Runnable() {
			public void run() {
				handler.post(new Runnable() {
					@Override
					public void run() {
					    Log.v(TAG, "showMessage Runnable ThreadID: " + Thread.currentThread());
						synchronized (synLock) {
						    Log.v(TAG, "showMessage toast text: " + msg);
							if (toast != null) {
							    Log.v(TAG, "tosat != null");
							    // 修复4.0中推荐下载信息不完善
//								toast.cancel();
								toast.setText(msg);
								toast.setDuration(Toast.LENGTH_SHORT);
							} else {
								toast = Toast.makeText(act, msg, Toast.LENGTH_SHORT);
							}
//							toast.setGravity(gravity, 0, 0);
							try{
							    toast.show();
							} catch(Exception e) {
							    Log.d(TAG, "Exception " + e.getMessage());
							}
							Log.v(TAG, "toast: " + toast);
						}
					}
				});
			}
		}).start();
	}


分析Bug可能产生的原因:

1.      怀疑是context出现问题的原因。

因为Toast.makeText(Contextcontext, CharSequencetext, int duration)中有如下解释:

context The context to use. Usually yourandroid.app.Applicationor android.app.Activityobject.

而源码中传入的context是从NetworkService中传入的,所以怀疑这可能是出现Bug的原因。

我将context从Launcher中传入,Toast依然没有出现;直接Toast.makeText(act, msg, Toast.LENGTH_SHORT).show();结果出现Toast提示信息,所以不是context的原因。

2.      怀疑是互斥锁和handler.post()中的原因。

在代码中加入Log信息,从Log打印出来的信息可以得出已经运行到了互斥域内的代码。Log打印出来的运行线程是在主线程中,而且在run的代码中加入Toast.makeText(act, msg, Toast.LENGTH_SHORT),有Toast显示。所以排除了互斥锁和Handler.post()的原因。

 

 

经过上述分析后觉得很奇怪,就向其它人请教,让我慢慢调试。

后来看到cancel()的解释如下:

Closethe view if it's showing, or don't show it if it isn't showing yet. You do notnormally have to call this. Normally view will disappear on its own after theappropriate duration.

就怀疑问题出在这里。将代码toast.cancel()注释掉后运行,发现Toast提示信息出现,跟他人汇报后,提示“可以看看4.0中Toast的源码”。

 

下面是2.2和4.0中Toast源码的链接:

http://www.oschina.net/code/explore/android-2.2-froyo/android/widget/Toast.java

http://www.oschina.net/code/explore/android-4.0.1/core/java/android/widget/Toast.java

比较两者关于cancel()处理的差异发现了如下差异:

在4.0中如下:

final Runnable mHide = new Runnable() {

           public void run() {

                handleHide();

                // Don't do this in handleHide()because it is also invoked by handleShow()

                mNextView = null;

           }

       };

而2.2中没有mNextView = null;这一行代码。

再查看show()中有如下源码:

if (mNextView == null) {

           throw new RuntimeException("setView must have been called");

       }

 

所以判断产生的Bug的原因是2.2系统和4.0系统对cancel的处理的差异造成的,将cancel注释就可以正常显示了。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sylcc_/article/details/7396452

智能推荐

Cocos2d-x在win7下的android交叉编译环境-程序员宅基地

文章浏览阅读763次,点赞8次,收藏17次。很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从哪里入手去学习,对此我整理了一些资料,需要的可以免费分享给大家我的【Github】会分享一些关于Android进阶方面的知识,也会分享一下最新的面试题~如果你熟练掌握GitHub中列出的知识点,相信将会大大增加你通过前两轮技术面试的几率!这些内容都供大家参考,互相学习。

轮番面试,阿里P8总结出了java程序设计,Javaweb框架面试题-程序员宅基地

文章浏览阅读256次,点赞5次,收藏10次。由于文案过于长,在此就不一一介绍了,这份Java后端架构进阶笔记内容包括:Java集合,JVM、Java并发、微服务、SpringNetty与 RPC 、网络、日志 、Zookeeper 、Kafka 、RabbitMQ 、Hbase 、MongoDB、Cassandra 、Java基础、负载均衡、数据库、一致性算法、Java算法、数据结构、分布式缓存等等知识详解。本知识体系适合于所有Java程序员学习,关于以上目录中的知识点都有详细的讲解及介绍,掌握该知识点的所有内容对你会有一个质的提升,

Android~apk的混淆和加固(1),你有过迷茫吗-程序员宅基地

文章浏览阅读579次,点赞29次,收藏11次。针对apk,加固是多维度的安全防护方案,包括反破解、反逆向、防篡改等,可以防止应用被各类常见破解工具逆向,安全性要远大于单纯的代码混淆。操作的对象是项目打包成的apk文件。为什么我们需要混淆?因为java字节码特性很容易反编译。对于加固,上架应用市场一般提供相关文档指导我们进行apk的渠道打包发布,这里不做展开我们先大概知道加固的一些原理。修改gradlerelease {参考需要保留的类及方法,确定项目中哪些不能混淆的类参考混淆模板,编写我们的混淆文件。

RAS使用拨号网络拨号的类_mfc ras拨号不用指定域名吗-程序员宅基地

文章浏览阅读4.7k次。RAS Socket 拨号网络_mfc ras拨号不用指定域名吗

[Unity][Android]安卓adb真机调试Profile性能检测缩短时间_unity android 真机性能显示-程序员宅基地

文章浏览阅读4.9k次。unity编辑器 连接 安卓设备 进行 adb真机调试的时候,unity需要设置 分析模式,才能 显示 安卓 的Debug.log信息当Unity使用ADB服务对安卓构建apk进行build的时候,不要一开始 使得Unity分析窗口进入分析模式,而是 当 安卓设备 进入到自己 想要调试的 位置,再开启分析模式显示 代码中的Debug.log信息。在Unity编辑器 使用ADB服务对安卓 进行 分析的 时候,只要开启 分析模式 就会 很卡。..._unity android 真机性能显示

随便推点

Qt上报错:undefined reference to xxx@openssl_1.0.0_undefined reference to symbol 'x509_get_subject_na-程序员宅基地

文章浏览阅读3.8k次,点赞2次,收藏6次。关于openssl版本不兼容问题产生原因解决办法原本pro配置文件:/*无效的配置*/#增加程序库文件路径LIBS += \ -lcurl -lcrypto -ljsoncpp直接上错误代码:/usr/lib/x86_64-linux-gnu/libcurl.so:对‘PKCS12_PBE_add@OPENSSL_1.0.0’未定义的引用/usr/lib/x86_64-linux-gnu/libcurl.so:对‘OCSP_basic_verify@OPENSSL__undefined reference to symbol 'x509_get_subject_name@@openssl_1_1_0

N叉树(N-ary Tree)-程序员宅基地

文章浏览阅读2.7k次。N叉树N 叉树的定义N 叉树的遍历N 叉树的经典递归解法"自顶向下"的解决方案"自底向上"的解决方案N 叉树的定义二叉树是一棵以根节点开始,每个节点含有不超过 2 个子节点的树。将这个定义扩展到 N 叉树 。 一棵以根节点开始,每个节点不超过 N 个子节点的树,称为 N叉树阅读参考:https://leetcode-cn.com/leetbook/read/n-ary-tree/x0wi57/N 叉树的遍历一棵二叉树可以按照前序、中序、后序或者层序来进行遍历。在这些遍历方法中,前序遍历、后序遍历和_n叉树

shell脚本编程常见系统变量和环境变量,shell脚本常用流程控制语句_熟悉shell常用的系统变量和环境变量,练习语句-程序员宅基地

文章浏览阅读6.1k次。shell编程常见系统变量命令功能$0当前脚本名称$?命令或程序执行完后的状态,返回0则表示执行成功$n当前脚本的第n个参数,n=1,2,…9$#当前脚本的参数个数(不包括程序本身)$*当前脚本的所有参数(不包括程序本身)$$程序本身的PID号shell编程常见环境变量命令功能PATH命令所示路径,以冒号为分割PWD显示当前所在路径USER打印当前用户名ID打印当前用户id信息TERM_熟悉shell常用的系统变量和环境变量,练习语句

PostgreSQL 获取拼音首字母的函数 (可以获取所有中文字符)经典原创分享-程序员宅基地

文章浏览阅读1.4k次。CREATE OR REPLACE FUNCTION "gis"."get_hzpycap"("v_str" varchar, "needhz" int4=0) RETURNS "pg_catalog"."varchar" AS $BODY$DECLARE pos INT4; hzlen INT4; hz ..._pg 中文简拼函数

深度学习框架Pytorch学习笔记-程序员宅基地

文章浏览阅读902次,点赞24次,收藏23次。由于工作原因,需要使用到深度学习pytorch框架,所以,跟随视频学习了深度学习框架的使用方法

JWT的Token自动续期和主动终止_jwt 续期-程序员宅基地

文章浏览阅读8.7k次,点赞17次,收藏43次。(1)JWT的续签问题和终止问题 JWT的优势在于无状态,也就是生成的Token中本身有存储信息(payload),所以不需要依赖Redis和DB。JWT本身也有有效期参与签名,问题在于这个有效期不能更改,也很好理解如果参与签名的参数(有效期)发生变化,Token也就不一样了。如果有效期不能改变,即便时间设计的再长,也会有到期的时候,而且Token这种设计初衷也不能有效期很长,导致用户在操作过程中Token到期授权失败,这种情况根本是无法接受的。 另外,JWT的Token签发之后,理论上在到_jwt 续期

推荐文章

热门文章

相关标签