錯(cuò)誤信息
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)
錯(cuò)誤原因
從日志看烹俗,錯(cuò)誤是使用Handler和Looper出錯(cuò),使用Handler時(shí)并沒(méi)有對(duì)Looper進(jìn)行初始化萍程。但是我并沒(méi)有創(chuàng)建使用Handler幢妄,我僅僅只是使用了Toast。僅僅只是在子線(xiàn)程中寫(xiě)了一句:
Toast.makeText(MainActivity.this, "test", Toast.LENGTH_LONG).show();
通過(guò)翻看源碼茫负,Toast的show和hide方法的實(shí)現(xiàn)是基于Handler機(jī)制蕉鸳。但是其代碼中只初始化了Handler:
final Handler mHandler = new Handler();
并沒(méi)有初始化Looper的方法(Looper.perpare()和Looper.loop()),說(shuō)明Toast使用的Handler是當(dāng)前調(diào)用的線(xiàn)程的Looper。所以潮尝,當(dāng)我們?cè)谥骶€(xiàn)程(也就是UI線(xiàn)程中)可以隨意調(diào)用Toast.makeText方法榕吼,因?yàn)锳ndroid系統(tǒng)幫我們實(shí)現(xiàn)了主線(xiàn)程的Looper初始化。但是我們是在子線(xiàn)程中調(diào)用的勉失,同時(shí)初始化Looper羹蚣,因此出現(xiàn)此錯(cuò)誤
http://www.2cto.com/kf/201502/374764.html
解決辦法
在待使用的子線(xiàn)程中初始化Looper。具體實(shí)現(xiàn)的方式為:
Looper.prepare();
Toast.makeText(getApplicationContext(), "test", Toast.LENGTH_LONG).show();
Looper.loop();