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的解决方案的主要内容,如果未能解决你的问题,请参考以下文章

Toast 运行在主线程

android如何通知用户使用 Toast OkHttp 请求返回 200 事情吗

Toast不消失问题

奇特:子线程的Toast怎么显示不出来?

如何从 vuex 操作中调用 bootstrap-vue 模态和 toast?

怎么解决toast连续弹出的问题