我有調用連接到IRC服務器的新線程的代碼。線程有循環來偵聽來自IRC服務器的響應,並調用一個方法'ProcessData'來響應。使用處理程序向正在運行的線程發佈消息
在我的用戶界面上,我希望能夠'退出'在onStop和onPause的IRC服務器。我遇到的麻煩是,當我使用Handler向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;
在活動的onPause我將消息發送給處理器
Message msg = new Message();
msg.obj = IRCManager.QUIT;
networkHandler.sendMessage(msg);
編輯:這裏是過程數據的方法
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服務器的輸入流。這也可能與它有關。
你可以發佈processData方法嗎? – 2013-03-25 14:11:26
您好,我已更新原始帖子 – Stephen 2013-03-25 14:17:49
sendMessage()是否進行網絡調用? – 2013-03-25 14:18:40