Android开发之在子线程中使用Toast

来源:互联网 发布:知乎日报源码 编辑:程序博客网 时间:2024/06/05 14:42

在子线程中使用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;      }
}
 

0 0
原创粉丝点击