private static final Object WAIT_SYNC = new Object();
…
synchronized (WAIT_SYNC) {
try {
WAIT_SYNC.wait();
} catch (InterruptedException ex) {
throw new KeyPromptingInterruptedException(ex);
}
}
目前是这块wait导致ANR,以下是本人adb抓到log
Reason: Input dispatching timed out (Waiting to send non-key event because the touched window has not finished processing certain input events that were delivered to it over 500.0ms ago. Wait queue length: 8. Wait queue head age: 14922.4ms.)
…
synchronized (WAIT_SYNC) {
try {
WAIT_SYNC.wait();
} catch (InterruptedException ex) {
throw new KeyPromptingInterruptedException(ex);
}
}
目前是这块wait导致ANR,以下是本人adb抓到log
Reason: Input dispatching timed out (Waiting to send non-key event because the touched window has not finished processing certain input events that were delivered to it over 500.0ms ago. Wait queue length: 8. Wait queue head age: 14922.4ms.)
解决方案
40
首先这段等待的代码应该是被写到了主UI线程的处理流程中了,原因是线程调用WAIT_SYNC.wait()等待被唤醒,此时假如没有另外的线程调用WAIT_SYNC.notify()或WAIT_SYNC.notifyAll()的时候,主线程会一直等待,原因是忙等待而没有接收用户输入导致ANR
建议这段等待的代码不要放到ui线程,而要放到另外的工作线程中,然后等某些条件满足之后在另外的线程代码中去唤醒
参考:http://www.cnblogs.com/adamzuocy/archive/2010/03/08/1680851.html
建议这段等待的代码不要放到ui线程,而要放到另外的工作线程中,然后等某些条件满足之后在另外的线程代码中去唤醒
参考:http://www.cnblogs.com/adamzuocy/archive/2010/03/08/1680851.html