Android子线程使用Handler情况分析
2017-01-02 本文已影响0人
and2long
如果在子线程中直接创建Handler并使用,如下代码所示:
new Thread(){
@Override
public void run() {
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
Toast.makeText(MainActivity.this, "handler msg", Toast.LENGTH_SHORT).show();
}
};
handler.sendEmptyMessage(0);
}
}.start();
此时运行会报异常:
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
原因分析:
非主线程默认没有创建Looper对象,也没有没有开启消息循环。
解决方法:
- 直接获取当前子线程的looper
new Thread(){
@Override
public void run() {
Looper.prepare(); //获取当前线程的Looper,并prepare();
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
Toast.makeText(MainActivity.this, "handler msg", Toast.LENGTH_SHORT).show();
}
};
handler.sendEmptyMessage(0);
Looper.loop(); //looper开始处理消息。
}
}.start();
- 获取主线程的lopper
new Thread(){
@Override
public void run() {
Handler handler = new Handler(getMainLooper()) { //直接使用主线程的Looper
@Override
public void handleMessage(Message msg) {
Toast.makeText(MainActivity.this, "handler msg", Toast.LENGTH_SHORT).show();
}
};
handler.sendEmptyMessage(0);
}
}.start();