引言:很多人都知道不能再在子线程new一个Handler,android会报错,至于为什么会报错,并没有作深入的研究,今天一起来研究一下,顺手学习下android异步消息处理机制的问题。
在子线程中new 一个Handler为什么会出错?首先直接在子线程新建一个Handler?
new Thread(new Runnable() { @Override public void run() { Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); Toast.makeText(getApplicationContext(),"handler msg",Toast.LENGTH_SHORT).show(); } }; handler.sendEmptyMessage(1); } }).start();
结果不出意外报错:java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()。
Handler构造方法源码:
public Handler(Callback callback, boolean async) {
if (FIND_POTENTIAL_LEAKS) { final Class<? extends Handler> klass = getClass(); if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) && (klass.getModifiers() & Modifier.STATIC) == 0) { Log.w(TAG, "The following Handler class should be static or leaks might occur: " + klass.getCanonicalName()); } } mLooper = Looper.myLooper(); if (mLooper == null) { throw new RuntimeException( "Can't create handler inside thread that has not called Looper.prepare()"); } mQueue = mLooper.mQueue; mCallback </