如何在死线程警告上修复null向Handler发送消息?

时间:2011-08-16 09:42:23

标签: android

我有一个线程使用处理程序和消息将数据发送到活动。一切正常,除非活动暂停:

null sending message to a Handler on a dead thread
java.lang.RuntimeException: null sending message to a Handler on a dead thread
    at android.os.MessageQueue.enqueueMessage(MessageQueue.java:196)
    at android.os.Looper.quit(Looper.java:173)
    at pocket.net.ComD.stopConnection(ComD.java:154)
    at pocket.net.ComD.finalize(ComD.java:184)
    at dalvik.system.NativeStart.run(Native Method)

在我的活动中,我有以下代码,它允许我关闭线程打开的所有网络连接:

public void onPause() 
{
    if(this.myThread != null) {
        this.myThread.stopConnection();
    }
}

在我的主题中:

public void run()
{
    this.setName("MessagesThread");
    if(this.initSocket())
    {

            Looper.prepare();
            this.threadHandler = initHandler();
            Looper.loop();
    }
    else
    {
        this.timeout();
    }
}

public void stopConnection()
{
    if(this.threadHandler != null) {
        this.threadHandler.removeMessages(ALIVE); // Remove a delayed message   
        this.threadHandler.getLooper().quit(); // Warning
    }
    this.connected = false;
    if(this.client != null) {
        this.client.close();
    }
}

private Handler initHandler()
{
    return new Handler() {

        public void handleMessage(Message msg)
        {
            switch(msg.what)
            {
                //Handling messages
            }
        }
    }
}

当我收到警告“在死线程上向处理程序发送空消息”时,该活动是否尝试向线程或对面发送消息?

我该如何解决这个问题?

由于

1 个答案:

答案 0 :(得分:6)

您收到错误,因为已经调用了Looper.quit()。

  

因此,在第一次调用Looper.quit()之后,消息队列基本上无法使用,因为它将具有空目标的消息排入队列,这是消息队列停止排队并显示为“死”的神奇标识符

您需要执行以下操作:

private boolean stoppedFlag= false;
public void stopConnection()
{
    if(this.threadHandler != null) {
        this.threadHandler.removeMessages(ALIVE); // Remove a delayed message   
        if(!stoppedFlag){
            this.threadHandler.getLooper().quit(); // Warning
            stopFlag = true;
        }
    }
    this.connected = false;
    if(this.client != null) {
        this.client.close();
    }
}

停止多次调用quit()

Ref Looper

Ref Looper SOQ