使用处理程序向正在运行的线程发送消息

时间:2013-03-25 14:06:29

标签: android multithreading sockets

我有代码调用连接到IRC服务器的新线程。线程有循环来侦听来自IRC服务器的响应,并调用方法'ProcessData'来执行响应。

在我的UI上,我希望能够在onStop和onPause中“退出”IRC服务器。我遇到的麻烦是,当我使用Handler将消息发布到我的IRC线程时,它向IRC服务器发送一个QUIT命令,它告诉我我正在UI线程上执行网络操作。

处理程序是在我的IRCManager类中设置的(这个类扩展了Thread,是我在一个单独的线程上运行的类。

public Handler networkHandler = new Handler() {

    @Override
    public void handleMessage(Message msg) {

        try {
            processData((String) msg.obj);
        } catch (IOException e) {
            Log.e(TAG, "network handler given an object NOT of type String");
        }
        super.handleMessage(msg);
    }

};

我使用主活动中的处理程序,并在启动网络线程后实例化它

irc.start();
networkHandler = irc.networkHandler;

在onPause事件中,我向处理程序发送消息

Message msg = new Message();
msg.obj = IRCManager.QUIT;
networkHandler.sendMessage(msg);

编辑:这是processData方法

void processData(String data) throws IOException {

    if (data.contains("PING")) {
        String pingId = data.substring(6, data.length());
        sendMessage(pong + pingId + "\n");
        isConnected = true;

        Message msg = new Message();
        msg.what = 1;
        msg.obj = "test";
        handler.sendMessage(msg);

    } else if (data.contains("Welcome")) {
        sendMessage("PRIVMSG " + BOT_NAME + " JOIN " + siteId + "\n");

    } else if (data.contains(IRCManager.QUIT)) {
        disconnect();

    } else if (isClientConnected()) {
        Message msg = new Message();
        msg.what = 2;
        msg.obj = "test";
        handler.sendMessage(msg);
    }
}

似乎处理程序没有正确链接到线程。任何人都可以阐明我如何做到这一点?

我的线程实际上花了99%的时间在一个while循环中检查来自IRC服务器的输入流。这也可能与它有关。

2 个答案:

答案 0 :(得分:2)

您在这里创建了HandlernetworkHandler的实例:

public Handler networkHandler = new Handler() {
因此,它将与UI线程相关联。

而且,当你说:

  

我使用主活动中的处理程序,并在启动网络线程后实例化它

irc.start();
networkHandler = irc.networkHandler;

您没有在那里创建Handler的实例;你只是抓住它的引用。

您实际上需要在非UI Handler的{​​{1}}方法中创建run()的实例。

答案 1 :(得分:1)

尝试在

中使用另一个new Handler(new Handler.Callback() )的构造函数