前言

今天早上测试应用的时候,忽然发现Toast弹不出来了,我用的华为测试机,以为是通知权限被关了,后来发现是开着的,这就纳了闷了,这个Toast工具类用了好长时间了,后来发现这Toast原来还能这样...

正文

以前工具类是这个样子的(华为的通知权限放在了其他的地方)

final public class ToastUtil {private static Toast toast;//单例的toast/*** 显示Toast*/public static void showToast(int text) {showToast(App.getInstance().getResources().getString(text));}public static void showToast(String text) {if (toast == null)toast = Toast.makeText(App.getInstance(), text, Toast.LENGTH_SHORT);toast.setText(text);toast.show();}
}

平时用的都是好好的,为什么不能用了呢?

然后我通过debug发现所有路径都走了,说明是调用成功了,后来想起来,是不是子线程的问题,打印了一下线程信息:

Thread.currentThread().getName();

发现果然第一次调用没有跑在主线程中,这就尴尬了,在子线程中创建,并show()竟然没有报错,而且子线程创建的在主线程调用show()也没有报错,只是不显示

到show()的源码中发现,被try了..

    /*** Show the view for the specified duration.*/public void show() {if (mNextView == null) {throw new RuntimeException("setView must have been called");}INotificationManager service = getService();String pkg = mContext.getOpPackageName();TN tn = mTN;tn.mNextView = mNextView;try {service.enqueueToast(pkg, tn, mDuration);} catch (RemoteException e) {// Empty}}

修改方法

在创建和show的时候可以判断是否是主线程,如果不是就放到主线程中就ok了

修改后的代码,嗯,这样就可以了(虽然有强迫症看到这代码很不爽,但是首先得能用)

final public class ToastUtil {private static Toast toast;//单例的toast/*** 显示Toast*/public static void showToast(int text) {showToast(App.getInstance().getResources().getString(text));}public static void showToast(final String text) {if (toast == null) {//AppManager.getAppManager().currentActivity()是使用工具类获取当前Activity对象的方法AppManager.getAppManager().currentActivity().runOnUiThread(new Runnable() {@Overridepublic void run() {toast = Toast.makeText(App.getInstance(), text, Toast.LENGTH_SHORT);toast.show();}});} else {//如果show()是在子线程触发的,则在主线程来显示if ("main".equals(Thread.currentThread().getName())) {toast.setText(text);//将文本设置给toasttoast.show();} else {AppManager.getAppManager().currentActivity().runOnUiThread(new Runnable() {@Overridepublic void run() {toast.setText(text);//将文本设置给toasttoast.show();}});}}}
}

ps:近些天看到了一个类似的情况,比我分析的源码更多:怀疑人生,主线程修改UI也会崩溃?

扩展

如果你因为某些情况,真的要在某个(注意是某个)子线程中弹出toast,可以使用以下方法在子线程开一个loop,这样就可以弹toast了(当然你要自己知道后果,具体百度):

    thread {Looper.prepare()Toast.makeText(context, "123", Toast.LENGTH_LONG).show()Looper.loop()}

如果遇到了连续弹toast后,导致后续一段时间弹不出toast,可以使用以下方法 ,效果看起来一样,只不过每次调用都是使用的新toast对象:

//将这两行代码toast.setText(text);//将文本设置给toasttoast.show();
改为:toast.cancel()toast = Toast.makeText(app, text, Toast.LENGTH_LONG)toast.show()

end

Toast弹不出来之谜相关推荐

  1. weui 加载提示_weui Toast弹出式提示 使用教程

    js代码// pages/03caozuofankui/05-toast.js Page({ /** * 页面的初始数据 */ data: { }, openToast: function () { ...

  2. 快速找到message toast弹出的application代码位置

    show Created by Jerry Wang, last modified on Jul 14, 2015 在MessageToast的show方法里设置断点: re-launch appli ...

  3. Android中使用Toast弹出提示消息的优化(弹出多个吐丝提示)- 代码已封装可直接使用

    在开发Android APP时经常会使用吐丝提示,如果直接使用[Toast.makeText(context, text, Toast.LENGTH_SHORT).show();]方法,连续弹出吐丝时 ...

  4. Android使用BroadCastRecevier广播实现接收短信,并利用Toast弹出显示内容

    在上一篇文章 Android简单实现BroadCastReceiver广播机制 中简单的实现了一个广播机制,这里利用BroadCarstRecevier实现一个接收短信并显示内容的案例,当然至于接收到 ...

  5. android toast居中显示_android Toast 弹出在屏幕中间位置以及自定义Toast

    Toast 我想我们应该使用的都很多,一般我们使用默认设置较多,但是默认设置往往不能满足我们的需求,那我们现在来自定义下: 默认Toast: Toast.makeText(MainActivity.t ...

  6. 原生JS封装 toast 弹层,自动关闭

    由于公司业务需求,要一个公共toast ,下面是自己封装的一个. css: .toast {text-align: center;min-height: 70px;width: 220px;color ...

  7. Android开发之自定义Toast(带详细注释)

    因为工作需求,所以自己研究了自定义Toast,这里做出总结: 在此之前有一点需要提前说明:Toast与其他组件一样,都属于UI界面中的内容,因此在子线程中无法使用Toast弹出提示内容,如果强行在子线 ...

  8. 【Win 10 应用开发】Toast通知激活应用——前台后台

    原文:[Win 10 应用开发]Toast通知激活应用--前台&后台 老周最近热衷于讲故事,接下来还是讲故事时间. 有人问我:你上大学的时候,有加入过学生会吗?读大学有没有必要加入学生会? 哎 ...

  9. Android应用Activity、Dialog、PopWindow、Toast窗体加入机制及源代码分析

    [工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处.尊重劳动成果] 1 背景 之所以写这一篇博客的原因是由于之前有写过一篇<Android应用setCont ...

最新文章

  1. SqlServer按照指定顺序对字段进行排序
  2. 凯文·凯利:下一个5000天的12个必然趋势!
  3. UVA - 10934 Dropping water balloons(装满水的气球)(dp)
  4. CodeForces-500C
  5. [iOS] Win8下在Vmware11中安装使用苹果系统OS X 10.10
  6. Java 12:使用开关表达式进行映射
  7. JAVA——实验肆——多线程
  8. java io-字节流/字符流-继承图
  9. 朝阳工程技术学校计算机应用,超8成高职院校开设“计算机应用技术专业”
  10. 【NOIP2013】【Luogu1966】火柴排队(逆序对)
  11. 创建Dockerfile,构建jdk+tomcat环境
  12. 使用ExtendSim进行制造业仿真
  13. 《计算智能导论》下载
  14. ssm体检信息管理系统毕业设计(附源码、运行环境)
  15. Linux:邮箱客户端
  16. 王者荣耀无限火力服务器,王者荣耀无限火力8.0
  17. 计算机知识在物理学中的应用,浅谈物理学在多种领域中的应用
  18. 给Delphi7升级安装TeeChart pro v7)】
  19. 音频分析之——时域转频域
  20. 【人工智能】技术采纳:重新思考医疗保健的罗杰钟形曲线

热门文章

  1. ntu 课程笔记 :MAS714(7) 最短路径和优先队列
  2. tableau可视化数据分析60讲(九)-tableau数值计算字符串计算(重点知识)
  3. Tableau必知必会之用 Page 功能创建你的动态视图
  4. tensorflow从入门到精通100讲(七)-TensorFlow房价预估使用Keras快速构建模型
  5. 5类6类7类网线对比_未来值得投资的6类苗木,5年内市场前景应该都不错!
  6. Python入门100题 | 第056题
  7. 结构主题模型(一)stm包工作流
  8. Python编程基础:第三十六节 模块Modules
  9. numpy.empty详解
  10. 明天是我的生日,写给24岁的自己