Handler中不能操作Toast的解决方案
Posted 吴豪杰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Handler中不能操作Toast的解决方案相关的知识,希望对你有一定的参考价值。
前言
在安卓开发中,Toast和AlertDialog可以说是最常用的控件之一了吧,但是你在实际开发中有没有遇到过这个异常呢:
Can’t create handler inside thread that has not called Lopper.prepare()
没错,细心的你一定发现了这不就是在“非主线程中操作UI”或“在Handler中嵌套Handler”引发的异常吗,那么关于为什么会出现此错误,以及如何解决这种异常,笔者将在此文中进行简单讲解。
缘由
不能够在Handler中嵌套Handler大家都知道,也尽量在避免,那么在Handler中为什么还不能使用Toast呢,这个其实是因为Toast内部是一个由Handler控制其延时来实现其定时自动消失效果的。至于不能在子线程中使用Toast也很好理解,显示Toast也属于UI操作,当然不能够在子线程中进行了。
这些问题在开发中尽量避免就好了,那实在无法避免有没有什么解决方案呢?答案是肯定的。
方案一
在UI操作外面包装一层 Looper.prepare()
和 Looper.loop()
即可,示例代码如下:
Looper.prepare();
// 此处执行UI操作
Toast.makeText(mContext, "text", Toast.LENGTH_SHORT).show();
Looper.loop();
方案二
使用Looper的变形:
new Handler(Looper.getMainLooper()).post(new Runnable()
@Override
public void run()
// 此处执行UI操作
Toast.makeText(mContext, "text", Toast.LENGTH_SHORT).show();
);
其它方案
还可以使用Handler、runOnUiThread、Async等方案来解决,具体实现此处就不一一赘述了。
最后说明一下笔者学识还很浅显,如有理解偏差,还请大家谅解和指点。
以上是关于Handler中不能操作Toast的解决方案的主要内容,如果未能解决你的问题,请参考以下文章
android如何通知用户使用 Toast OkHttp 请求返回 200 事情吗