创建了一个线程,并且在线程里面执行异步处理,如下:
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// do something
}
}, 100);
执行的时候出现:
Can't create handler inside thread that has not called Looper.prepare()
查看Handle.java源码:
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 = callback;
mAsynchronous = async;
}
发现是找不到Looper时抛出的异常。翻看其解释:
Class used to run a message loop for a thread.
Threads by default do not have a message loop associated with them;
to create one, call {@link #prepare} in the thread that is to run the loop,
and then {@link #loop} to have it process messages until the loop is stopped.
默认没有Loop关联,因此需要调用prepare / loop / quit 初始化、运行和退出loop.