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的初始化,或者想办法把其运行在主线程中。有两个方法:
1.在子线程中添加如下两个方法
Looper.prepare();//给当前线程初始化Looper
Toast.makeText().show();//Toast初始化的时候会new Handler(),无参构造默认获取当前线程的Looper, 如果没有prepare过,则抛出题主描述的异常。
Looper.loop() //最后调用,这种办法会终止子线程之后的代码, Looper.loop()里面是一个死循环。这样的话,会导致进程里面的线程越来越多,这个是不推荐的。
2.在主线程中建立一个重写了handleMessge()方法的android.os.Handler,然后在子线程中调用handle.handleMessge()(传入想要吐司吐出的内容即可)方法,然后会在主线程中重写handleMessge()方法中执行具体内容(在这里面调用Toast.makeText().show()方法即可)。