前几天写程序的时候碰到这么一个问题,当时想在子线程中Toast一段话,不废话上代码
new Thread(new Runnable() {
@Override
public void run() {
new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Toast.makeText(MainActivity.this,"Loading......",Toast.LENGTH_SHORT).show();
}
};
}
}).start();
因为之前在主线程中使用Handler的时候,初始化也没有给他传入过什么属性,就直接用了,然后报错
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
当时我就纳闷了,这Looper先前倒是听说过,但是从没研究过,去网上查了点资料后对代码进行了修改
new Thread(new Runnable() {
@Override
public void run() {
new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Looper.prepare();
Toast.makeText(MainActivity.this,"Loading......",Toast.LENGTH_SHORT).show();
Looper.loop();
}
};
}
}).start();
在添加了
Looper.prepare()和Looper.loop()
之后,就能够运行了。
出于程序员刨根问底的职业好奇心驱使,我查看了一下源码,了解了其中的运作道理。
1.Thread类中的ThreadLocal和ThreadLocalMap
ThreadLocal是线程中的局部变量,是每个线程单独持有的。以下是官方描述: