Android代码里Toast如何在子线程中调用

来源:互联网 发布:季后赛数据统计 编辑:程序博客网 时间:2024/05/22 19:29

在我们写Android代码时,不可避免会在子线程中调用toast,在写代码的时候不会报错,但是当你运行程序时,在这个toast显示的时候就会报错:

12-19 09:43:17.822 3076-3141/com.yuchung.shenghuo E/AndroidRuntime: FATAL EXCEPTION: Thread-143
                                                                    Process: com.xxxxx.xxxxx PID: 3076
                                                                    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:327)
                                                                        at android.widget.Toast.<init>(Toast.java:92)
                                                                        at android.widget.Toast.makeText(Toast.java:241)
                                                                        at com.yuchung.shenghuo.View.User_Register$1.run(User_Register.java:118)
                                                                        at java.lang.Thread.run(Thread.java:841)

这个错误显示是looper对象的原因,但很多人不会去看报错都会直接以为是toast属于ui所以不能再子线程中更新。

android的主线程中其android框架已经默认给出了一个looper对象, 而我们自己创建的子线程中,looper对象需要自己给构建出来。这也就是为什么我们在子线程中使用Toast

的时候会报出上图异常。。(如果不明白Toast为什么在子线程使用需要Looper对象的可自己观察源码)


解决方案:


既然已经知道了问题是如何产生的, 那么我们现在就只需要在我们的子线程中把Toast所需要的Looper对象给创建出来就可以了。
new Thread(new Runnable() {  
                    @Override  
                    public void run() {  
                        Looper.prepare();  
  
                        Toast.makeText(TwoActivity.this, "子线程显示", Toast.LENGTH_SHORT).show();  
                        Looper.loop();  
                    }  
                }).start();  


原创粉丝点击