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