美文网首页
子线程中使用Toast出错

子线程中使用Toast出错

作者: 客舟求简 | 来源:发表于2016-10-30 22:45 被阅读472次

    错误信息

    java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()                                                     at android.os.Handler.<init>(Handler.java:200)                            at android.os.Handler.<init>(Handler.java:114)                             at android.widget.Toast$TN.<init>(Toast.java:345) 
         at android.widget.Toast.<init>(Toast.java:101) 
         at android.widget.Toast.makeText(Toast.java:259)                          at demo.permission.example.com.MainActivity$1.run(MainActivity.java:22) 
         at java.lang.Thread.run(Thread.java:818) 
    
    

    错误原因

    从日志看,错误是使用Handler和Looper出错,使用Handler时并没有对Looper进行初始化。但是我并没有创建使用Handler,我仅仅只是使用了Toast。仅仅只是在子线程中写了一句:
    Toast.makeText(MainActivity.this, "test", Toast.LENGTH_LONG).show();
    通过翻看源码,Toast的show和hide方法的实现是基于Handler机制。但是其代码中只初始化了Handler:
    final Handler mHandler = new Handler();
    并没有初始化Looper的方法(Looper.perpare()和Looper.loop()),说明Toast使用的Handler是当前调用的线程的Looper。所以,当我们在主线程(也就是UI线程中)可以随意调用Toast.makeText方法,因为Android系统帮我们实现了主线程的Looper初始化。但是我们是在子线程中调用的,同时初始化Looper,因此出现此错误
    http://www.2cto.com/kf/201502/374764.html

    解决办法

    在待使用的子线程中初始化Looper。具体实现的方式为:

    Looper.prepare(); 
    Toast.makeText(getApplicationContext(), "test", Toast.LENGTH_LONG).show(); 
    Looper.loop(); 
    

    相关文章

      网友评论

          本文标题:子线程中使用Toast出错

          本文链接:https://www.haomeiwen.com/subject/zbvuuttx.html