首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Looper.loop()崩溃

Looper.loop()崩溃
EN

Stack Overflow用户
提问于 2021-12-21 07:32:07
回答 1查看 80关注 0票数 1
代码语言:javascript
复制
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.“。

EN

回答 1

Stack Overflow用户

发布于 2021-12-28 09:40:47

我绕过了这个问题,这样做:

  1. 使缓存无效,从设备(无论是物理的还是模拟器)重新启动

应用程序

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70431943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档