子线程中使用Toast出错

2016-10-30  本文已影响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(); 
上一篇下一篇

猜你喜欢

热点阅读