Toast在子线程中的使用

mLooper = Looper.myLooper();
if (mLooper == null) {
    throw new RuntimeException("Can't create handler inside thread that has not called Looper.prepare()");
}

 使用Handler时要对Looper进行初始化的,Toast.makeText().show()方法里面(源码里面)建立了一个handler,因此须要Looper的初始化,可是Android系统帮咱们实现了主线程(也就是UI线程中)的Looper初始化。因此在子线程中要使用Toast.makeText方法须要本身Looper的初始化,或者想办法把其运行在主线程中。有两个方法:android

1.在子线程中添加以下两个方法ide

Looper.prepare();//给当前线程初始化Looperoop

Toast.makeText().show();//Toast初始化的时候会new Handler(),无参构造默认获取当前线程的Looper,                                           若是没有prepare过,则抛出题主描述的异常。spa

 Looper.loop()  //最后调用,这种办法会终止子线程以后的代码, Looper.loop()里面是一个死循环。这样的话,会致使进程里面的线程愈来愈多,这个是不推荐的。线程

2.在主线程中创建一个重写了handleMessge()方法的android.os.Handler,而后在子线程中调用handle.handleMessge()(传入想要吐司吐出的内容便可)方法,而后会在主线程中重写handleMessge()方法中执行具体内容(在这里面调用Toast.makeText().show()方法便可)。进程

相关文章
相关标签/搜索