美文网首页问题分析
关于 Thread 异常 IllegalStateExcepti

关于 Thread 异常 IllegalStateExcepti

作者: Phoenix的学习历程 | 来源:发表于2017-05-25 10:30 被阅读0次

    有时候在使用Thread和 handler 进行线程操作的时候会发生 IllegalStateException,
    错误信息包含 IllegalStateException: Handler (android.os.Handler) {e8f132} sending message to a Handler on a dead thread
    一般出现这种错误意味着在 handler 进行 postMessage / post 操作的时候,Lopper 中的 MessageQueue 队列对象空了。
    以下列举一种发生这种问题可能的原因。

    example 1

    HandlerThread thread = new HandlerThread(new String("TAG"));
    
    Handler handler = new Handler(thread.getLooper());
    //normal operation
    handler.post(new Runnable(){
        //do something
        });
    
    thread.quit();
    
    if(thread.getState() == Thread.State.NEW) {
        thread.start();
    }
    
    handler = new Handler(thread.getLooper());
    //operation that will cause exception
    handler.post(new Runnable() {
        //do something
        });
    

    上面是一段会发生异常的代码。
    在 post 时会把 runnable 入队列,此时在 MessageQueue 的入队操作会进行判断,如果 mQuitting 为 true,则抛异常

    image.png

    基于以上原因,HandlerThread 在 quit 之后尽量不要再次使用
    而是重新 new 一个出来
    因为 HandlerThread 并没有提供重新初始化的方法..也即是 quit 一次之后,MessageQueue 的 mQuitting 参数就永远为 true 了.. :-(

    相关文章

      网友评论

        本文标题:关于 Thread 异常 IllegalStateExcepti

        本文链接:https://www.haomeiwen.com/subject/lybaxxtx.html