我有代码调用连接到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服务器的输入流。这也可能与它有关。
答案 0 :(得分:2)
您在这里创建了Handler
,networkHandler
的实例:
public Handler networkHandler = new Handler() {
因此,它将与UI线程相关联。
而且,当你说:
我使用主活动中的处理程序,并在启动网络线程后实例化它
irc.start(); networkHandler = irc.networkHandler;
您没有在那里创建Handler
的实例;你只是抓住它的引用。
您实际上需要在非UI Handler
的{{1}}方法中创建run()
的实例。
答案 1 :(得分:1)
尝试在
中使用另一个new Handler(new Handler.Callback() )
的构造函数