0%

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()即可,示例代码如下:

1
2
3
4
Looper.prepare();
// 此处执行UI操作
Toast.makeText(mContext, "text", Toast.LENGTH_SHORT).show();
Looper.loop();

方案二

使用Looper的变形:

1
2
3
4
5
6
7
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
// 此处执行UI操作
Toast.makeText(mContext, "text", Toast.LENGTH_SHORT).show();
}
});

其它方案

还可以使用Handler、runOnUiThread、Async等方案来解决,具体实现此处就不一一赘述了。
最后说明一下笔者学识还很浅显,如有理解偏差,还请大家谅解和指点。