Android 使用处理程序将消息发布到正在运行的线程

Android 使用处理程序将消息发布到正在运行的线程,android,multithreading,sockets,Android,Multithreading,Sockets,我有一些代码,可以调用连接到IRC服务器的新线程。线程有一个循环来侦听来自IRC服务器的响应,并调用一个方法“ProcessData”来操作响应 在我的UI上,我希望能够在onStop和onPause中“退出”IRC服务器。我遇到的问题是,当我使用一个处理程序向我的IRC线程发送一条消息,向IRC服务器发送一个QUIT命令时,它告诉我我正在UI线程上执行网络操作 该处理程序是在我的IRCManager类中设置的(该类扩展了线程,是我在单独线程上运行的类) public Handler netwo

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

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

该处理程序是在我的IRCManager类中设置的(该类扩展了线程,是我在单独线程上运行的类)

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;
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服务器的inputstream。这可能也与此有关。

尝试使用另一个构造函数和
新处理程序(new Handler.Callback())
内部尝试使用另一个构造函数和
新处理程序(new Handler.Callback())
内部

您正在创建
处理程序
网络处理程序
的实例,如下所示:

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

当你说:

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

irc.start();
networkHandler = irc.networkHandler;
irc.start();
networkHandler = irc.networkHandler;
您没有在那里创建
处理程序的实例;您只是获取对它的引用


实际上,您需要在非UI
线程的
run()
方法中创建
处理程序的实例,您正在创建
处理程序的实例,
网络处理程序
,如下所示:

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

当你说:

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

irc.start();
networkHandler = irc.networkHandler;
irc.start();
networkHandler = irc.networkHandler;
您没有在那里创建
处理程序的实例;您只是获取对它的引用


实际上,您需要在非UI
线程的
run()
方法中创建
处理程序的实例

您可以发布processData方法吗?您好,我已经更新了原始的postDoes sendMessage()进行网络调用?是的。它向IRC服务器发送一条消息,然后这是您在主线程上的网络操作。您可以发布processData方法吗?您好,我已经更新了原始的postDoes sendMessage()进行网络调用吗?是的。它向IRC服务器发送一条消息,然后这是您在主线程上的网络操作。