0

我有调用连接到 IRC 服务器的新线程的代码。线程有循环来监听来自 IRC 服务器的响应,并调用方法“ProcessData”来操作响应。

在我的 UI 上,我希望能够在 onStop 和 onPause 中“退出”IRC 服务器。我遇到的问题是,当我使用处理程序向我的 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 服务器的输入流。这可能也与它有关。

4

2 回答 2

2

您正在这里创建 , 的Handler实例networkHandler

public Handler networkHandler = new Handler() {

因此它将与 UI 线程相关联。

而且,当你说:

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

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

您没有创建Handler那里的实例;您只是在获取对它的引用。

您实际上需要在non-UIHandler的方法中创建实例。run()Thread

于 2013-03-25T14:22:50.297 回答
1

尝试在new Handler(new Handler.Callback() )内部使用另一个构造函数

于 2013-03-25T14:14:10.527 回答