public final class JEventLoop {
private static final ThreadLocal<Stack<JEventLoop>> sThreadLocal = new ThreadLocal<>();
private int mCode = 0;
private Handler mHandler;
private volatile boolean mDone;
private final AtomicInteger mExec = new AtomicInteger();
private final Object mLock = new Object();
public JEventLoop(){
}
private static class ExitException extends RuntimeException{
ExitException(){
super();
}
}
@Override
protected void finalize(){
Logger.d("JEventLoop finalized");
}
public int exec(){
if (!mDone){
Stack<JEventLoop> stack;
synchronized (mLock){
if (mDone){
mDone = false;
return mCode;
}
Looper looper = Looper.myLooper();
if (mHandler == null) {
if (looper == null){
Looper.prepare();
looper = Looper.myLooper();
}
mHandler = new Handler(looper);
}else {
if (mHandler.getLooper() != looper){
Logger.e("%s has already executed.",this);
return -1;
}
}
stack = sThreadLocal.get();
if (stack == null){
stack = new Stack<>();
sThreadLocal.set(stack);
}
stack.push(this);
}
while (!mDone){
mExec.incrementAndGet();
try {
Looper.loop();
}catch (ExitException ignored){
}
mExec.decrementAndGet();
}
if (stack.pop() != this)throw new IllegalThreadStateException("JEventLoop internal error");
}
mDone = false;
return mCode;
}
public void done(int code){
mCode = code;
mDone = true;
synchronized (mLock){
if (mHandler != null){ mHandler.postAtFrontOfQueue(this::exit); }
}
}
private void exit(){
if (mExec.get() > 0)throw new ExitException();
}
}当使用KeyboardEvent时,exec()方法将引发一个致命错误,.the控制台显示"Fatal signal 11 (SIGSEGV), code 1, fault addr 0x10e5704 in tid 29885.“。
发布于 2021-12-28 09:40:47
我绕过了这个问题,这样做:
应用程序
https://stackoverflow.com/questions/70431943
复制相似问题