错误信息
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();