`

Android-同一Context中多次弹出气泡消息注意事项

阅读更多

今天在项目中遇到这样一个问题 :

       同一个页面要求多次显示气泡消息Toast,即重复显示,重复显示的问题网上有解决方案,下面还会有介绍,我这里已经解决这个,真正碰到的问题来了,我用了不同的设备(设备主要区别是系统版本不同,一个android2.2,一个2.3.6,一个4.1.1)对程序功能进行测试,结果发现有的能正常显示,有的却只显示第一个Toast,后面的不再显示。

 

好了 问题描述完成,下面是解决过程:

 

1.Toast重复显示问题(为什么要说明这个呢?继续看你就知道了)

 

Toast重复显示不能直接重复编写,需要处理一下以避免造成用户使用的不便,详细解决方案请参考:http://mwxboy.diandian.com/post/2012-04-25/19583598,关键代码粘贴一下:

 

private static void showMessage(Context context,String aMsg, int gravity, int xOffset, int yOffset)

{

                //第一调用showMessage()进的是else,同一页面第二次调用进的是if,因为context相同

                 if(mContext == context)

                  {

                      mToast.cancel();//这句是造成后面问题的关键

                      mToast.setText(aMsg);

                   }

                  else

                   {

                        mContext = context;

                        mToast = Toast.makeText(mContext, null, 0);

                        mToast.setGravity(gravity, xOffset, yOffset);

                        mToast.setText(aMsg);

                    }

                      mToast.show();

   }

 

2.用上面的代码是解决了android中Toast的重复显示问题,但是注意,这个方法在Android 4.0版本以下的系统中不会引起我碰到的那个问题(这是我后面才发现的)。看完上面的代码,我打算研究了一下Toast的cancel()方法(因为考虑引起后面问题的是不是Toast占用和释放的原因,而Toast中的cancel()就是这样一个类似功能的方法),从网上一篇相关文章中得到启示,地址:http://dkmeteor.iteye.com/blog/1399646

最主要的启示是该文章的最后几句:

    2月28日追加:

实测 在2.2   2.3中此方法工作良好。

在4.0系统中效果极差

多次触发Toast  无法正常显示

 

从这几句话我确定了是cancel()在4.0系统中的使用有问题,于是我试着把 mToast.cancel();这句代码注释掉,调试通过,问题居然就解决了 ,在2.2和2.3中也没有问题了 。

由于花了点时间解决这个bug,所以记录下来给自己也给大家分享一点经验,可能不是完全正确,欢迎大家拍砖!

2013.01.18追加:

今天网上搜索android4.0 Toast.cancel()发现这篇文章,地址:http://blog.csdn.net/sylcc_/article/details/7396452,里面介绍了4.0中cancel源码和其他版本的不同,从这里得到昨天碰到问题的根本原因,在此感谢该文章的原创作者。下面贴出里面的一个片段:

 

”下面是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注释就可以正常显示了。“

 

但是4.0以下系统需要用到cancel()怎么办?下面是另一篇文章 http://blog.csdn.net/gouguofei/article/details/7814195 给出的一个解决办法,贴出片段:

 “但是注释掉以后对4.0以下的系统需要cancel()怎么办呢,这里我的解决办法是在程序里获取系统版本,如果是4.0及以上就不执行cancel(),否则执行cancel()。 ”

 

获取系统版本比较简单:int version = Integer.valueOf(android.os.Build.VERSION.SDK) 即可获得

 

 

 

 

0
0
分享到:
评论

相关推荐

    Android-Android实现气泡布局

    本文将深入探讨如何在Android中实现气泡布局,包括其基本原理、自定义View的创建以及在实际项目中的应用。 首先,气泡布局的基本特征是它具有一个圆形或近似圆形的头部,通常包含一个图标或文字,然后有一条指向...

    Android-SVProgressHUD-弹出框样式的载入视图效果.zip

    弹出框样式的载入视图效果。项目地址:https://github.com/saiwu-bigkoo/Android-SVProgressHUD 效果图:如何使用使用超简单:SVProgressHUD.show(context);ok.另外,还有其他方式打开:比如,有关遮挡背景的:...

    android-gif-drawable解决5.0适配

    3. **绘制优化**:在低版本Android中,GIF动图可能会出现绘制错误或显示不全的问题。`android-gif-drawable`通过自定义渲染策略解决了这些问题,保证了GIF的完整展示。 4. **控制功能**:原生Android对GIF的控制...

    [开源][安卓][炫酷菜单]Context-Menu.Android-master

    [开源][安卓][炫酷菜单]Context-Menu.Android-master Git上的炫酷菜单源码

    Android-Context-Menu.Android.zip

    Android-Context-Menu.Android.zip,你可以很容易地添加令人敬畏的动画上下文菜单到你的应用程序。,安卓系统是谷歌在2008年设计和制造的。操作系统主要写在爪哇,C和C 的核心组件。它是在linux内核之上构建的,具有...

    安卓消息推送通知栏相关-Android--CardView新闻展示推送效果.rar

    此资源"安卓消息推送通知栏相关-Android--CardView新闻展示推送效果.rar"主要关注如何利用CardView组件来构建美观且实用的新闻展示推送效果。CardView是Android支持库中的一个视图容器,它为内容提供了一个带有阴影...

    Android-Universal-Image-Loader Demo和jar包

    《Android-Universal-Image-Loader:高效加载...通过学习和使用Android-Universal-Image-Loader,开发者可以构建出更加流畅、用户体验优良的应用,尤其是在处理大量图片时,其强大的功能和优秀的性能将体现得尤为明显。

    spring-context-support-4.0.0.M2.jar

    spring-context-support-4.0.0.M2.jar 需要用到的可以下载

    用Dialog实现的主动弹出式气泡

    在Android开发中,为了增强用户体验,我们经常需要创建各种类型的弹出界面,如对话框(Dialog)和PopupWindow。在给定的标题“用Dialog实现的主动弹出式气泡”和描述中,我们看到一个特定的需求:创建一个能够主动弹...

    spring-context-support.jar

    spring-context-support.jar spring整合任务调度quartz必需jar 还需要quartz-all-x.x.x.jar quartz版本必需在1.8.x以下

    Android-TopActivity展示当前app所处的最顶activity

    在Android应用开发中,了解和控制应用程序的Activity堆栈是非常重要的。"TopActivity"这个概念就是用来描述在当前运行的应用中位于最顶端的那个Activity。它代表着用户当前正在交互的界面,是用户可见并且可以直接...

    Android自定义弹出框实现(修改版)完整实例源码

    首先,我们要理解Android中的弹出框(Dialog)是一种轻量级的窗口,它浮于应用程序主窗口之上,用于展示临时信息或进行简单的交互操作。Android SDK提供了多种预定义的Dialog样式,如AlertDialog、ProgressDialog等...

    android 底部弹出菜单(带透明背景)

    在Android开发中,底部弹出菜单(通常称为Bottom Sheet或者PopupWindow)是一种常见的交互元素,用于展示临时性的操作选项或信息。本篇文章将详细讲解如何创建一个带有透明背景的底部弹出菜单,以及相关的实现技术和...

    谈谈Android里的Context的使用

    大家好,今天给大家分享一下Android里的Context的一些用法. 这里大致可以分为两种:一是传递Context参数,二是调用全局的Context. 其实我们应用启动的时候会启动Application这个类,这个类是在AndroidManifest.xml...

    Android-I-Jetty服务器

    这个项目旨在让开发者能够在Android应用中搭建和运行自己的服务器,以实现数据交换、API调用或者进行本地测试等功能。本文将详细介绍Jetty服务器以及如何在Android平台上集成和使用它。 ### 1. Jetty简介 Jetty是...

    android 弹出窗口

    在Android开发中,弹出窗口(PopupWindow)是一种常见的用户交互元素,用于在主界面之上显示临时信息或者提供额外的功能选项。它不像是一个独立的Activity,而是依附于现有的视图并能自由控制其显示位置和样式。下面...

    spring-context.jar jar包 上下文

    jar包分享,你懂的 spring-context.jar spring-context.jar spring-context.jar spring-context.jar spring-context.jar

    Android封装popwindow类(下拉菜单弹出和收缩效果)

    在Android开发中,`PopWindow`是一个非常实用的组件,常用于实现各种临时弹出窗口的效果,如下拉菜单、工具提示等。本教程将详细讲解如何封装一个`PopWindow`,实现下拉菜单的弹出和收缩效果。 首先,我们需要了解`...

    Android Context使用例子.

    在Android开发中,`Context`是一个非常核心的概念,它就像是应用程序的一个全局环境或者上下文,提供了与系统服务交互的能力。`Context`的理解和正确使用对于编写健壮的Android应用至关重要。下面将详细介绍`Context...

    android 全屏弹出dialog,底部弹入,底部弹出+弹出dialog输入法

    这个功能在很多应用场景中都非常有用,比如在登录、注册或者评论等场景,用户可能需要在全屏界面中弹出一个Dialog进行输入。 首先,让我们了解Dialog的基本概念。Dialog是Android中一种轻量级的窗口组件,它通常...

Global site tag (gtag.js) - Google Analytics