在子线程中使用Toast的时候,出现Force close。
错误提示:Can't create handler inside thread that has not called Looper.prepare()
解决方法:
在Toast.makeText().show()方法前面添加Looper.prepare();
在Toast.makeText().Show()方法后面添加Loop.loop();
原因:
子线程只是一个普通的线程,其ThreadLoacl中没有设置过Looper,所以会抛出异常。
因为Toast在创建的时候会依赖于一个Handler,并且一个Handler是需要有一个Looper才能够创建,而普通的线程是不会自动去创建一个Looper对象,比如说在某个Activity中能new一个Handler是因为Android系统在启动一个Activity的时候会默认的创建一个Looper对象,因此不能够在子线程中显示Toast,你可以在开启的子线程中执行Looper.prepare()来构建一个Looper,然后在显示Toast,但是不要忘记执行Looper.loop()来加载这个Looper,当然,也可以使用主线程的Looper,获取主线程的Looper的方法是Looper.getMainLooper();同时需要注意的是,同样的不能在子线程中去更新UI界面,因为Toast是相对独立于UI界面的,就好比应用虽然crash掉了,并且已经返回到home界面,但是Toast依然会在hone界面显示出来。
Runnable uploadImageRunnable = new Runnable() { @Override public void run() { if(TextUtils.isEmpty(imgUrl)){ Looper.prepare(); Toast.makeText(mContext, "还没有设置上传服务器的路径!", Toast.LENGTH_SHORT).show(); Looper.loop(); return; } }